public class Sandbox {
private static int arg;
public static void main(String args[]) {
for(int i = 99; i > 0; i--)
doSomething(i);
}
public static void doSomething(int arg) {
if(arg == 1 || arg == 2 || arg == 3) doSomething(--arg);
if(arg == 1 || arg == 2 || arg == 3) System.out.println(arg);
Sandbox.arg = arg;
}
}
运行时的输出如下:
1
2
1
我预计这不会输出任何内容,为什么输出1,2& 3?
答案 0 :(得分:2)
首先,消除你的哇Sandbox.arg
public static void main(String args[]) {
for (int i = 99; i > 0; i--)
doSomething(i);
}
public static void doSomething(int arg) {
if (arg == 1 || arg == 2 || arg == 3)
doSomething(--arg);
if (arg == 1 || arg == 2 || arg == 3)
System.out.println(arg);
// Sandbox.arg = arg;
}
你仍然得到
1
2
1
你用99,1包含的每一个值来调用它。这包括3,2和1.
使用3
,
if(arg == 1 || arg == 2 || arg == 3) doSomething(--arg); //<-- recurse with "2"
if(arg == 1 || arg == 2 || arg == 3) System.out.println(arg); //<-- print "2"
显然是在使用2
if(arg == 1 || arg == 2 || arg == 3) doSomething(--arg); //<-- recurse with "1"
if(arg == 1) // <-- print "1".
因此,当arg为1
然后为2(因为你预先创建了arg)时,你得到3
的递归调用2。然后,您会在1
的循环中为2
获得另一个main()
。显然,1
if
arg
使{{1}} 0。
答案 1 :(得分:0)
对于从99到4的i的值,条件if (arg == 1 || arg == 2 || arg == 3)
保持为false,因此不执行任何操作。但是对于i=3, i=2, i=1
,条件是正确的。
现在,对于i = 3,相同的函数doSomething(--arg);
被递归调用,arg为--arg
,即2.类似地,它被称为i = 1.
当调用递归函数时,当前变量实例存储在堆栈中。
一旦放置了i = 1的递归调用,则调用下一个语句System.out.println(arg);
并打印1.现在弹出堆栈值,并且对于i = 2执行相同的语句,并且类似地对于i = 3。