我有这个类只打印一个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
为什么是向后打印然后减少?
答案 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)
。
也许这可以清楚一点
由于所有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}}