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

Java 为什么递归函数先做最后一部分?,java,recursion,Java,Recursion,我将基本情况指示为emptySpace=0,else if条件将基本情况指示为star=0。我原以为程序在打印星星后会先打印空格,但情况正好相反。它不应该先打印空格然后再打印星星吗 public static void displayStarss(int emptySpace, int star) { if (emptySpace != 0) { displayStarss(emptySpace - 1, star); System.out.print

我将基本情况指示为
emptySpace=0
,else 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);
}

假设我们用参数2将其称为
emptySpace
stars

电话如下

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>>
displayStarss(2,2)//从主(起点)调用
displayStarss(1,2)//从if调用
displayStarss(0,2)//从if调用
displayStarss(0,1)//如果
displayStarss(0,0)//如果

现在,如果您解开上面的调用序列,可以看到它必须在空格之前打印星号。

假设我们使用参数2来调用它,用于
emptySpace
stars

电话如下

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>>
displayStarss(2,2)//从主(起点)调用
displayStarss(1,2)//从if调用
displayStarss(0,2)//从if调用
displayStarss(0,1)//如果
displayStarss(0,0)//如果

现在,如果您解开上述调用序列,可以看到它必须在空格之前打印星号。

它按照您的顺序进行操作:

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(" ");

它按照您的命令行事:

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(" ");

没有。它可以按顺序做。这完全取决于你如何组织程序。 考虑以下事项:

公共静态无效计数(int n){
//当n==0时,启动返回过程
如果(n==0){
返回;
}
//还没有印刷任何东西
//再次呼叫计数,这次小于n。
计数(n-1);
//所有返回都将在此处结束,恢复以前的每个返回
//n的改变值。
系统输出println(n);
}
此程序将打印从
1
n
的所有值。这是因为print语句是在递归调用
count
之后的
,每次指定一个小于
n
。因此,调用堆栈保留这些值并按顺序返回它们


如果在调用
count
之前移动print语句,则值将从
n
打印到
1
。在后一种情况下,返回仍然发生,但没有执行任何操作,因此它们只是连续返回,直到方法返回到原始调用方。

没有。它可以按顺序做。这完全取决于你如何组织程序。 考虑以下事项:

公共静态无效计数(int n){
//当n==0时,启动返回过程
如果(n==0){
返回;
}
//还没有印刷任何东西
//再次呼叫计数,这次小于n。
计数(n-1);
//所有返回都将在此处结束,恢复以前的每个返回
//n的改变值。
系统输出println(n);
}
此程序将打印从
1
n
的所有值。这是因为print语句是在递归调用
count
之后的
,每次指定一个小于
n
。因此,调用堆栈保留这些值并按顺序返回它们


如果在调用
count
之前移动print语句,则值将从
n
打印到
1
。在后一种情况下,返回仍然发生,但没有执行任何操作,因此它们只是连续返回,直到方法返回到原始调用方。

如何调用它?选择较低的数字,用铅笔和纸“玩电脑”,或者一步一步地看代码。另外,如果在每个分支中将递归调用下移一行,并在进入递归之前使用print语句,则会发生什么。如何调用它?选择较低的数字,用铅笔和纸“玩电脑”,或者一步一步地浏览代码。另外,在进入递归之前,观察如果将递归调用在每个分支中下移一行并使用print语句会发生什么。