我有一些代码,我无法理解代码是如何执行的,我的意思是程序流程。
代码:
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, 我在调试时看到的流程:
n
值大于零,则控制转到第7行,即prinit()再次通过递减n值调用一次。答案 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,
为了更好地理解,在调试时将返回语句中的断点更好。
这是控制/内存流程图:
编辑1:或者below图片说明:
答案 1 :(得分:3)
让我一步一步地使用调试模式向您解释。
请在调试模式下从头到尾查看一堆方法。
因为它是一个递归方法,直到
所示n>0
才被调用。这意味着此方法有三个调用,如下面的快照
现在它将返回值并从方法堆栈返回,如下面的快照
所示
最后,它将返回
main
方法,称之为
由于此方法被调用三次,因此您将获得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。