反转递归java方法

Tyl*_*r G 2 java recursion

我正在读一本名为"思考Java:如何像计算机科学家一样思考"的书,我最近介绍了递归方法.

public static void countdown(int n)
{
  if (n == 0) {
      System.out.println("Blastoff!");
  } else {
      System.out.println(n);
      countdown(n - 1);
  }
}
Run Code Online (Sandbox Code Playgroud)

这将是一个正常的递归方法,用于倒数到0,我理解发生了什么,但如果你在System.out.println之前进行递归调用,就像这样

public static void countdown(int n)
{
  if (n == 0) {
      System.out.println("Blastoff!");
  } else {
      countdown(n - 1);
      System.out.println(n);
  }
}
Run Code Online (Sandbox Code Playgroud)

它以相反的方式计算,所以如果我为这两个条件语句给出参数3,那么第一个变为"3,2,1,Blastoff!" 但是第二个1是"Blastoff,1,2,3"....我不明白它是如何工作的,有人可以尝试解释这段代码中发生的事情,使其以相反的方式计数吗?

Eri*_*uan 9

我会尝试为你想象它.

第一种方法

countdown(3)                (first call)
"3"                         (sysout)
    countdown(3-1)          (second call)
    "2"                     (sysout)
        countdown(2-1)      (third call)
        "1"                 (sysout)
            countdown(1-1)  (fourth call)
                "Blastoff!" (n == 0)
Run Code Online (Sandbox Code Playgroud)

第二种方法

countdown(3)                (first call)
    countdown(3-1)          (second call)
        countdown(2-1)      (third call)
            countdown(1-1)  (fourth call)
                "Blastoff!" (n == 0. going back up call stack)
            "1"             (sysout)
        "2"                 (sysout)
    "3"                     (sysout)
Run Code Online (Sandbox Code Playgroud)