这个方法里面发生了什么?

时间:2014-05-14 09:50:51

标签: java recursion

当我用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 来自哪里。

我请求你的帮助。谢谢。

3 个答案:

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