尽管我认为我对在void方法中解决堆栈有扎实的了解,但return方法的确使我对堆栈的理解更加混乱。下面的方法使我特别困惑,因为我以为它将返回0,但是返回12。
public static int mystery(int n) { // where the method call is mystery(7)
n--; // since n is decremented before the first
// recursive method, the first stack is method(6)
if(n > 0) // base case
mystery(n);
return n * 2; // 0 * 2 = 0?
}
我的问题是,为什么方法0在mystery(7)时输出12(如果0是要进入堆栈的最后一个值)。这种方法会不会仍然遵循LIFO?
答案 0 :(得分:1)
这必须是这样的:
public static int mystery(int n) { // where the method call is mystery(7)
n--; // since n is decremented before the first
// recursive method, the first stack is method(6)
if(n > 0) // base case
n = mystery(n);
return n * 2; // 0 * 2 = 0?
}
现在它将始终返回0。
答案 1 :(得分:0)
由内而外:
对mystery
的最里面的调用(在输入时n为1)向其调用者返回0。不使用返回值。
下一个mystery
级别(n在输入时为2)返回2给它的调用者。不使用返回值。
...等等...
mystery
的倒数第二级(n在输入时为6)向其调用方返回10。不使用返回值。
mystery
的最外层级别(入口处n为7)向其调用方返回12,这是最终返回值。
答案 2 :(得分:0)
我们不考虑7。假设您的值为3。mystery(3)
。在这种情况下,该功能将运行3次。
首次运行:
n = 3;
n--; // n = 2
(n > 0) so mystery(2)
第二次运行:
n = 2;
n--; // n = 1
(n > 0) so mystery(1)
第三次运行:
n = 1;
n--; // n = 0
(n = 0) so return the n*2 . And the return will be 4
为什么?因为递归函数不会更改n