回顾我的笔记,并想知道是否有人对下面发生的事情有一个简明的解释:
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
HelloWorld! 9
HelloWorld! 8
HelloWorld! 7
HelloWorld! 6
HelloWorld! 5
HelloWorld! 4
HelloWorld! 3
HelloWorld! 2
HelloWorld! 1
GoodBye from 0
GoodBye from 1
GoodBye from 2
GoodBye from 3
GoodBye from 4
GoodBye from 5
GoodBye from 6
GoodBye from 7
GoodBye from 8
GoodBye from 9
GoodBye from 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
HelloWorld! 9
HelloWorld! 8
HelloWorld! 7
HelloWorld! 6
HelloWorld! 5
HelloWorld! 4
HelloWorld! 3
HelloWorld! 2
HelloWorld! 1
GoodBye from 0
为什么调用堆栈在遇到else语句时似乎没有展开?
答案 0 :(得分:4)
在两种情况下,调用堆栈都会展开。当它在第二个片段中展开时,它不会打印任何内容,因为当"GoodBye from " + n
为0时,您只打印n
,这恰好发生一次。
答案 1 :(得分:1)
在第二种情况下,else块仅对n = 0
执行,因为它在if块中。但是在第一种情况下,每次递归完成后System.out.println("GoodBye from " + n);
将被执行,因为它不受任何条件的约束。