繁体   English   中英

递归:我不明白为什么代码会打印出n个整数1,2,3,4,5

[英]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)
              • n不是> 0 ,所以它返回时没有做任何事情
            • 它打印“1”
          • 它打印“2”
        • 打印“3”
      • 打印“4”
    • 打印“5”
    • 完成。

实际上它非常简单。

如果我们在另一个函数中调用某个函数,那么一旦被调用的函数完成它的执行,控制就会返回到同一个函数。

在你的情况下,当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.printn1 (我们仍然在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM