2017-05-25 46 views
0

回顧我的筆記,並想知道如果任何人有什麼下面發生的簡要說明:基本遞歸與如果else語句(JAVA)

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語句不放鬆?

+7

爲什麼只有當n爲0(或更小)時纔會打印再見1-10? – Dukeling

+3

當它進入'if'語句時,你爲什麼期望它執行else語句呢? –

+0

0只能達到一次,因此只有一次執行else分支。在兩個版本中堆棧解繞發生了11次,只有沒有'else'添加了10個額外的打印。 –

回答

4

調用堆棧在兩種情況下展開。當它在第二個片段中展開時,它不會打印任何內容,因爲只有當n爲0時纔會打印"GoodBye from " + n,該內容只發生一次。

+0

謝謝!非常感激 :) – Harry

1

在第二種情況下,else塊將僅執行n = 0,因爲它正在if塊中進行。但是,在第一種情況下,每次遞歸完成後,System.out.println("GoodBye from " + n);將被執行,因爲它不受任何條件約束。