我是Java新手。我需要知道这个递归方法是如何工作的以及如何调用它。
为什么"我来自Y"打印2次?
来电者:z(3);
通话方式
public void z(int i){
int y=i;
System.out.println("I am from Z");
if(y<5){
z(++i);
System.out.println("I AM FROM Y");
}
}
输出:
I am from Z I am from Z I am from Z I AM FROM Y I AM FROM Y
答案 0 :(得分:3)
让我们跟踪递归调用。
z(3) is called.
Prints "I am from Z"
y is 3 and y < 5: "if" is entered.
z(4) is called.
Prints "I am from Z"
y is 4 and y < 5: "if" is entered.
z(5) is called.
Prints "I am from Z"
y is 5 and "if" is NOT entered. This recursive call ends.
Prints "I AM FROM Y". This recursive call ends.
Prints "I AM FROM Y". This recursive call ends.
&#34;我来自Y&#34;打印两次,每次打印一次&#34; z(4)&#34;方法调用和&#34; z(3)&#34;方法调用,但不是由&#34; z(5)&#34;方法调用。
答案 1 :(得分:0)
答案 2 :(得分:0)
我会稍微简化您的方法,因为在这种情况下y
可以替换为i
public static void z(int i) {
System.out.println("I am from Z");
if (i < 5) {
z(++i);
System.out.println("I AM FROM Y");
}
}
如您所见,只有当z(++i)
小于i
时,此方法才会递归调用另一个5
。另外I am from Z
是强制性的(没有条件阻止它打印),但I AM FROM Y
是可选的(它取决于i < 5
的结果,就像递归调用一样)。
换句话说,最后一次递归调用(不会调用另一个z(++i)
,因为i
不会比5
更少)也不会打印I AM FROM Y
。
这意味着I am from Z
将始终打印的时间超过I am from Y
。
您可以通过这种方式将其可视化
I am from Z -------> z(3)
I am from Z ------> z(4)
I am from Z -----> z(5) here `i` is `5` so no `I AM FROM Y` will be printed
I AM FROM Y ------> z(4)
I AM FROM Y -------> z(3)
让您I am from Z
打印三次,I AM FROM Y
打印两次。