使用if-else语句的基本递归(java)

使用if-else语句的基本递归(java),java,recursion,Java,Recursion,回顾我的笔记,想知道是否有人对下面发生的事情有一个简明的解释: public class HelloWorld{ public static void main(String[]args){ helloWorld(10); } public static void helloWorld(int n){ if(n > 0){ System.out.println("HelloWorld! " + n); helloWorld(n-1)

回顾我的笔记,想知道是否有人对下面发生的事情有一个简明的解释:

public class HelloWorld{

public static void main(String[]args){
    helloWorld(10);

}

public static void helloWorld(int n){
      if(n > 0){
        System.out.println("HelloWorld! " + n);
        helloWorld(n-1);
        }
        System.out.println("GoodBye from " + n);
      }
    }
输出:

HelloWorld!10
地狱世界!9
地狱世界!8.
地狱世界!7.
地狱世界!6.
地狱世界!5.
地狱世界!4.
地狱世界!3.
地狱世界!2.
地狱世界!1.
从0再见
再见
再见,从2号开始
3点再见
再见,从4号开始
5点再见
6点再见
7点再见
8点再见
9点再见
10点再见
要清楚一点,我完全理解上面递归和调用堆栈展开的过程。我的问题是,当我在下面加入else语句时会发生什么:

public static void helloWorld(int n){

    if(n > 0){
        System.out.println("HelloWorld! " + n);
        helloWorld(n-1);

        }else{
        System.out.println("GoodBye from " + n);

        }
    }
输出:

HelloWorld!10
地狱世界!9
地狱世界!8.
地狱世界!7.
地狱世界!6.
地狱世界!5.
地狱世界!4.
地狱世界!3.
地狱世界!2.
地狱世界!1.
从0再见

为什么调用堆栈在命中else语句时似乎没有展开

在这两种情况下,调用堆栈都会展开。在第二个代码段中展开时,它不会打印任何内容,因为当
n
为0时,只打印
“再见自”+n
,这两种情况下只会发生一次。

调用堆栈展开。当它在第二个代码段中展开时,它不会打印任何内容,因为当
n
为0时,只打印
“再见自”+n
,这只会发生一次。

在第二种情况下,else块将仅对
n=0
执行,因为它将在if块中执行。但是在第一种情况下,在每个递归完成后,
System.out.println(“再见”+n)将被执行,因为它不受任何条件的约束。

在第二种情况下,else块将仅对
n=0执行,因为它将在if块中执行。但是在第一种情况下,在每个递归完成后,
System.out.println(“再见”+n)将被执行,因为它不受任何条件的约束。

如果只有当n为0(或更小)时才会打印再见1-10?当它进入
if
语句时,为什么您希望它也执行else语句?0只到达一次,因此只有一次执行else分支。在这两个版本中,堆栈展开都发生了11次,仅在没有添加
else
10个额外打印的情况下。如果仅在n为0(或更小)时才会打印1-10?当它进入
if
语句时,您为什么希望它也执行else语句?0只到达一次,因此,只有在执行else分支之后。在两个版本中,堆栈展开都进行了11次,仅在没有
的情况下进行,否则将添加10个额外的打印。谢谢!非常感谢:)谢谢!非常感谢:)