Java 什么';在这个方法中发生了什么?

Java 什么';在这个方法中发生了什么?,java,recursion,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),也就

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

我请求你的帮助。多谢各位

这里我不明白的是,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)

中。您必须注意,对
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)
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。

绘制跟踪,您就会明白。这是一个递归函数-搜索该术语。但是要理解递归,你必须首先理解递归要理解什么是递归,你需要理解什么是递归@PeterRader递归通常不是循环的:P@PeterRader-拼写错误真的会把它变成另一个问题!嗨,为什么
返回0
打印
i:0
(在第5行)?我认为它应该简单地返回0,而不是打印来自if测试下的print语句的
I:0
。当
i=0
没有通过if测试时,我认为永远不应该调用print语句(sys out)。当
i=1
时,它通过了
if(i>0)
中的
if(i>0)
测试。结果执行了
foo(i-1)
,并返回
0
。已打印,而
(i=0)>0
为假,因此未打印
i:-1
。希望这能解决问题!:)添加:
返回0
foo(i-1)
foo(1)
的返回语句<因为在
foo(1)
中,
i>0
为真,所以打印了code>i:0
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).
}