递归打印

时间:2015-04-11 06:27:05

标签: java recursion

我有这个类只打印一个int:

class PRecursion  {
    public static void main(String[] args){     
       foo(1);
 }

public static void foo(int x){
    System.out.println("" + x);

    if (x < 3)
        foo(x+1);
    System.out.println(""+x);   
   }

}

输出:

1
2
3
3
2
1

为什么是向后打印然后减少?

3 个答案:

答案 0 :(得分:4)

实际上并没有减少。发生的事情是:

  • 您正在致电foo(1)
  • foo(1)执行此操作并启动递归
  • 递归持续多久你告诉它(在你的例子中foo(3)
  • 递归完成后,foo(1)仍然有一个要执行的语句,即:

    System.out.println(""+x);

因此您第二次看到foo(1)的打印,但是在完成所有其他打印之后。每隔一段时间foo()调用不同的数字也是如此。所以最后看起来它正在减少,当你真正只是以相反的顺序以相反的顺序 打印时。

答案 1 :(得分:3)

x的值不递减但是它执行的代码的剩余部分看起来像递减。

  System.out.println(" " + x);   // 1 2 3

    if (x < 3)
        foo(x+1);
  System.out.println(""+x);   //3 2 1

由于递归,它一次又一次地调用相同的函数并且只打印第一个print语句,直到if条件为真,但在if为假时结束时它会停止执行{{1}并且当最后一步x中的执行为3时,将其余的打印语句用来打开,以便打印foo(x+1)

也许这可以清楚一点


Execution flow


由于所有3 2 1都被执行导致输出foo(1)-->foo(2)-->foo(3),执行是在最后一个方法1 2 3中所以它开始执行剩余的方法语句,其中的流程如foo(3)打印执行的剩余print语句看起来像向后的所有函数,导致剩余的foo(3)-->foo(2)-->foo(1)

答案 2 :(得分:3)

试试这个:

class PRecursion  {
    public static void main(String[] args){     
       foo(1);
 }

public static void foo(int x){
    System.out.println("before " + x);

    if (x < 3)
        foo(x+1);
    System.out.println("after "+x);   
   }

}

第二个打印语句不会减少输入。发生的事情是它在foo(3)调用foo(2)之后离开set x=1 print x (i.e. 1) push x=1 on stack and set x=2 (this is how you can read foo(x+1)) print x (i.e. 2) push 2 on stack and set x=3 print x (i.e. 3) Don't push anything (x<3 is false) print x again (i.e. 3) pop x=2 off the stack print x (i.e. 2) pop x=1 of the stack print x (i.e. 1) 的调用,最后是`foo(1)。因此它以第一个的顺序反向执行第二个打印语句。

如果您将程序的执行读出为:

print 1
print 2
print 3
print 3
print 2
print 1

剥离推送和弹出你得到:

{{1}}