关于节目输出的困惑

时间:2015-03-23 08:23:50

标签: java

public class Main {
    public static void main(String[] args) {        
        pop1(1234);     
    }

    public static void pop1(int x){
        System.out.print(x % 10);   
        if ((x / 10) != 0){
            pop1(x/10);
        }   
        System.out.print(x % 10);
    }   
}

输出:43211234

我不明白输出。 过去'4321'是好的;但最后一部分'1234'是如何生成的?

4 个答案:

答案 0 :(得分:0)

最后System.out.print(x % 10); - >此行会导致值1,2,3,4被打印。这是每个方法调用的最后一行。

输入X:4->3->2->1(现在从此处开始打印) 打印1,然后堆栈展开(方法返回),然后2打印等等..

答案 1 :(得分:0)

当pop1函数从递归返回时调用第二个打印 - 这是其他四个数字以相反顺序打印的原因。删除它,你会没事的。

答案 2 :(得分:0)

第一次致电:

System.out.print(x % 10); 

生成反向编号4321,而第二次调用生成直接订单1234。因此,如果您只需要直接/反向订单,请删除行。

因此,您从第二个1234调用中获得直接订单print(),因为它在递归调用之后执行,即最里面的递归调用在第一个位置打印1,而最外面的调用打印{{ 1}}在最后一个地方。

答案 3 :(得分:0)

为了可视化发生的事情,您可以像这样修改代码

public class Main {
    public static void main(String[] args) {        
        pop1(1234);     
    }

    public static void pop1(int x){
        System.out.println("enter: " + x % 10);   
        if ((x / 10) != 0){
            pop1(x/10);
        }   
        System.out.println("leave: " + x % 10);
    }   
}

产生输出

enter: 5
enter: 4
enter: 3
enter: 2
enter: 1
leave: 1
leave: 2
leave: 3
leave: 4
leave: 5

将此输出与@TheLostMind的答案结合起来,您将了解代码的工作原理。