这个递归循环代码是如何执行的

时间:2014-04-13 04:07:08

标签: java recursion

我有一些代码,我无法理解代码是如何执行的,我的意思是程序流程。

代码:

1) public class RecurLoopTest {

2)  public static void main(String[] args) {
3)      printit(2);
4)  }

5)  private static int printit(int n){
6)      if(n>0){
7)          printit(--n);
8)      }

9)      System.out.print(n+",");

10)     return n;
11) }

12) }

我认为输出应该是: 0,

但输出为: 0,0,1,

我在课堂上做了很多次DEBUG, 我在调试时看到的流程:

  1. 从第3行开始执行,即以2作为参数调用printit()。
  2. 第6行,如果条件检查n值大于零,则控制转到第7行,即prinit()再次通过递减n值调用一次。
  3. 步骤2连续执行,直到n值变为0,然后是第6行,如果condition为false。所以在第9行,SYSO打印0。
  4. 然后,无法理解,控件如何从第10行再次变为5?

4 个答案:

答案 0 :(得分:4)

在此程序printit()中调用了三次。

  

控制如何从第10行再次进入5 ??

以下是控制的流程:

  • printit(0) - n=0,打印"0,",返回 0
  • printit(1) - n=1,打印"0,",返回 0
  • printit(2) - n=2,打印"1,",返回 1
  • main()

因此输出为: 0,0,1, 为了更好地理解,在调试时将返回语句中的断点更好。

这是控制/内存流程图: enter image description here

编辑1:或者below图片说明: enter image description here

答案 1 :(得分:3)

让我一步一步地使用调试模式向您解释。

请在调试模式下从头到尾查看一堆方法。

  

因为它是一个递归方法,直到n>0才被调用。这意味着此方法有三个调用,如下面的快照

所示

enter image description here

  

现在它将返回值并从方法堆栈返回,如下面的快照

所示

enter image description here

enter image description here

  

最后,它将返回main方法,称之为

enter image description here

由于此方法被调用三次,因此您将获得0,0,1,

答案 2 :(得分:2)

第一次调用n为2,

if(n>0){ // 2, note this is an if - not a while loop.
  printit(--n); // recurses, after this n = 1; references won't update by the recursion.
                // Well, not with primitives or immutable types anyway.
  // n = printit(n - 1); // <-- This would behave like you seem to expect.
  // n = printit(--n);   // <-- and so would this, but not in C!
}

System.out.print(n+","); // prints 1 !!!!
return n; // <- returns 1

答案 3 :(得分:0)

不要考虑递归方法调用,而是先调用任何方法。例如,如果在main中调用方法,程序将执行该方法并执行该方法中的所有代码。一旦方法执行完毕,程序流程返回main并继续执行main中的代码行。这同样适用于递归调用。

在使用2的第一次运行时,2大于0.因此,您将2减1,然后调用printIt(1)。这意味着一旦调用的函数完成运行,程序将返回此处。但由于printIt()是递归的,下一个调用也会等待自身内的任何方法调用。

因此,在下一次调用时,n现在为1,大于0.您将其递减为0,然后调用printIt(0)。当这种情况发生时,它会在if (n > 0)检查失败并进入第9行打印0然后返回。

由于完成,程序将返回printIt()的第二次调用。请记住,在此调用中,n为0.现在可以继续执行自己的第9行并打印0.然后重复打印到打印1的printIt()的原始调用。

所以说完了,你得到0,0,1。