为什么递归函数首先做最后一部分?

时间:2019-07-08 15:31:38

标签: java recursion

我将基本情况表示为emptySpace=0,在if条件中将基本情况指定为star=0。我期望程序在打印星星之后先打印空格,但情况恰恰相反。它不应该先打印空格然后再打印星星吗?

public static void displayStarss(int emptySpace, int star) {
    if (emptySpace != 0) {
         displayStarss(emptySpace - 1, star);
         System.out.print(" ");
    } else if (star != 0) {
        displayStarss(emptySpace, star - 1);
        System.out.print("*");
    }
}

public static void main(String[] args) {
    displayStarss(3, 3);
}

3 个答案:

答案 0 :(得分:2)

它会按照您的订单执行操作:

displayStarss(3, 3);
-> displayStarss(2, 3);
-> -> displayStarss(1, 3);
-> -> -> displayStarss(0, 3);
-> -> -> -> displayStarss(0, 2);
-> -> -> -> -> displayStarss(0, 1);
-> -> -> -> -> -> displayStarss(0, 0);
-> -> -> -> -> System.out.print("*");
-> -> -> -> System.out.print("*");
-> -> -> System.out.print("*");
-> -> System.out.print(" ");
-> System.out.print(" ");
System.out.print(" ");

答案 1 :(得分:0)

让我们说我们用emptySpacestars的参数2来称呼它

通话按

displayStarss(2, 2) //called from main (starting point)

displayStarss(1, 2) //called from if
displayStarss(0, 2) //called from if

displayStarss(0, 1) //called from else if
displayStarss(0, 0) //called from else if
<<recursion ends here and it returns>>

现在,如果您展开上述调用顺序,可以看出它必须在空格之前打印星星。

答案 2 :(得分:0)

不是。它可以按顺序执行。这完全取决于您如何构造程序。 请考虑以下内容:

   public static void count(int n) {
      // when n == 0 start the return process
      if (n == 0) {
         return;
      }
      // Nothing has been printed yet
      // Call count again, this time with one less than n.
      count(n - 1);
      // all returns will end up here, restoring each previously
      // altered value of n.
      System.out.println(n);
   }

此程序将打印从1n的所有值。这是因为print语句是after的对count的递归调用,每次都指定小于n的位置。因此,调用堆栈将保留这些值并按顺序返回它们。

如果将打印语句移动到调用count的正前方,则值将从n打印到1。在后一种情况下,返回仍然发生,但是什么也没做,因此它们只是连续返回,直到方法返回到原始调用者为止。