Java - 理解递归

Blu*_*Ree 6 java recursion

有人可以向我解释为什么打印1 2 3 4 5?我想它会打印4 3 2 1 0但我的书和日食都说我错了.

public class whatever {

    /**
     * @param args
     */
    public static void main(String[] args) {
        xMethod(5);

    }

    public static void xMethod(int n){
        if (n>0){
            xMethod(n-1);
            System.out.print(n + " ");
        }
    }


}
Run Code Online (Sandbox Code Playgroud)

ilo*_*mbo 19

这很简单,这些是电话

main
   xMethod(5)
      xMethod(4)
          xMethod(3)
             xMethod(2)
                 xMethod(1)
                     xMethod(0)
                 print 1
             print 2
          print 3
      print 4
  print 5
Run Code Online (Sandbox Code Playgroud)

所以你看到的印刷品是1,2,3,4,5

  • @BluceRee:为什么不应该呢?最终,每个函数都返回.(好吧,有很少没有,但是这已经变得技术化.)当最里面的调用`xMethod`返回时,下一个最里面的调用将从它停止的地方开始:在调用之后本身,在'印刷品'. (4认同)
  • 因为这是递归的行动,后`xMethod(n)中每一递归级别`返回有一个print语句是System.out.print`(N +"")',然后水平恢复到上一级调用它,并它打印它的值,依此类推,直到达到主级别并且程序结束. (3认同)

Mak*_*oto 5

这是调用堆栈的结果.这是用来打电话后的样子n = 5.将头部旋转大约180度,因为此调用链的底部实际上是堆栈的顶部.

  • xMethod(5)
    • xMethod(4)
      • xMethod(3)
        • xMethod(2)
          • xMethod(1)
            • xMethod(0)

在递归调用中,您有两种情况 - 基本案例和递归案例.这里的基本情况是何时n == 0,并且不再发生进一步的递归.

现在,当我们开始从这些电话回来时会发生什么?也就是说,在递归步骤之后会发生什么?我们开始做System.out.print().由于存在防止递归打印的条件n == 0,我们既不会递归也不会打印.

因此,您获得1 2 3 4 5输出的原因是由于从堆栈中弹出调用的方式.