我的预期结果是不会打印任何内容

在下面的示例中,如果我尝试读取代码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.printn的情况下调用1(我们仍在xMethod(1)堆栈框架中!)。

现在,xMethod(1)完成运行并返回,并从堆栈中弹出。控制权返回到xMethod(2)。然后循环继续,直到xMethod(5)返回。

10-06 02:47