[英]Recursion: I don't understand why the code will print out n integers 1,2,3,4,5
我的预期结果是不会打印任何东西
在下面的例子中,如果我尝试读取代码xMethod(5),因为它是一个递归函数,当= 0即xMethod(0)时,我期望它不应该进入if语句。
我对这段代码的期望是不应该有输出,因为print语句在递归方法之后
public class recursionThree {
public static void main(String[] args) {
xMethod(5);
}
public static void xMethod(int n){
if (n > 0){
xMethod(n-1);
System.out.print(n + " ");
}
}
}
您需要逐步完成该计划:
main
调用xMethod(5)
n > 0
,所以它调用xMethod(4)
n > 0
,所以它调用xMethod(3)
n > 0
,所以它调用xMethod(2)
n > 0
,所以它调用xMethod(1)
n > 0
,所以它调用xMethod(0)
> 0
,所以它返回时没有做任何事情 实际上它非常简单。
如果我们在另一个函数中调用某个函数,那么一旦被调用的函数完成它的执行,控制就会返回到同一个函数。
在你的情况下,当n == 0时,被调用的函数将控制权返回给调用函数,从而打印1,2,3,4,5。
方法不仅仅是被调用而不是返回。 他们回到来电者那里。
您可能知道,方法在被调用时会被推送到调用堆栈。 所以,当你调用xMethod(5)
它调用xMethod(4)
并调用 xMethod(3)
...创建这样的调用堆栈:
xMethod(0)
xMethod(1)
xMethod(2)
xMethod(3)
xMethod(4)
xMethod(5)
main
现在xMethod(0)
做了什么? 它不会进入if语句,因此会立即返回。 当一个方法返回时, 它会从调用堆栈弹出 ,并且控制权返回到堆栈中的下一个东西。 现在我们有:
xMethod(1)
xMethod(2)
xMethod(3)
xMethod(4)
xMethod(5)
main
记住我们还在xMethod(n-1);
在xMethod(1)
堆栈框架中的行? 由于xMethod(n-1)
返回,我们可以继续运行其余的代码。 因此,调用System.out.print
时n
为1
(我们仍然在xMethod(1)
堆栈帧中!)。
现在xMethod(1)
完成运行并返回并从堆栈中弹出。 控制权返回xMethod(2)
。 循环继续,直到xMethod(5)
返回。
在你的代码中,堆栈将为xMethod的这5次递归调用生成5帧。 在每次调用完成之前,System.out.print(n +“”)可以在帧中打印变量n。 你的内存堆栈看起来像这样
---------
| n=1 |
---------
| n=2 |
---------
| n=3 |
---------
| n=4 |
---------
| n=5 |
---------
每个框都是一个框架,每个框架将从上到下进行清理,因此输出为1 2 3 4 5
理解递归的最好方法是将递归调用视为黑盒子做他们应该做的事情。
所以你的xMethod
打印数字1到n。 它通过首先打印数字1到n-1(使用递归调用)然后打印数字n来完成此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.