我的预期结果是不会打印任何内容
在下面的示例中,如果我尝试读取代码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 + " ");
}
}
}
最佳答案
方法不仅会被调用而且不会返回。他们返回到呼叫者。
如您所知,方法在被调用时被推入调用堆栈。因此,当您调用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)
返回。