当我用2作为参数调用它时,我无法弄清楚这个方法中发生了什么。
public int foo(int i) {
if (i > 0) {
System.out.println(”i: ” + foo(i - 1));
}
return i;
}
此方法返回两个i。
1)i:0
2)i:1
我试着这样理解。当使用foo(2)调用该方法时, i 的值为 2 且大于零。所以它通过if测试。然后该方法在print方法中回忆起来; foo(2-1)是foo(1)。现在 i 的值是 1 ,它再次通过if测试;并且在打印方法中,foo(1-1)变为foo(0),它不通过if测试,因此它返回 i 的值,现在为零。我在这里不明白的是 i 的第二个值 1 来自哪里。
我请求你的帮助。谢谢。
答案 0 :(得分:8)
我在这里不明白的是i的第二个值是1来自哪里。
无论方法是否递归,总是返回i
。因此foo(2)
的调用将始终返回2,即使它在打印时递归。
这里的输出消息令人困惑,因为它没有打印i
。它可以帮助您了解您是否将其更改为:
public int foo(int i) {
if (i > 0) {
int recurse = foo(i - 1);
System.out.println("i: " + i + "; foo(i - 1): " + recurse);
}
return i;
}
请注意,您将获得结果"反向"订购,因为它会在 foo(1)
内时打印调用foo(2)
的结果。
答案 1 :(得分:2)
您必须注意,对foo()
的递归调用先于打印。
这是执行:
//foo(2)
| calls foo(2-1)
| //foo(1)
| | calls foo(1-1)
| | //foo(0)
| | | prints nothing // because it does not enter the if
| | | returns 0 // because 0 is the argument of foo(0)
| | prints "i: 0" // because 0 is the result of foo(0), called from foo(1)
| | returns 1 // because 1 is the argument of foo(1)
| prints "i: 1" // because 1 is the result of foo(1), called from foo(2)
| returns 2 // because 2 is the argument of foo(2)
答案 2 :(得分:1)
public int foo(int i) {
if(i > 0) System.out.println("i: " + foo(i - 1));
return i;
}
当i < 1
时,循环终止并返回i
。但是当i = 2
时,代码在堆中调用如下:
foo(2) {
System.out.println("i: " + foo(1){
System.out.println("i: " + foo(0){
// Condition for "if" failed here and does not continue.
return 0; // Prints: i: 0
});
return 1; // Prints: i: 1
});
return 2; // Returns 2 as foo(2).
}
内部递归返回用于打印,但最后只返回2。