使用return语句解析堆栈

时间:2018-12-14 02:53:43

标签: java recursion return

尽管我认为我对在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?

3 个答案:

答案 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

的值