2015-06-09 153 views
-2

這是很基本的Java程序對於理解步步遞歸函數的返回值,但不幸的是我無法實現這個輸出,plz幫助我完全理解這個問題,謝謝遞歸函數的方法

這是我的代碼

public class rectest 
{ 
    void myMethod(int counter) 
    { 
     if(counter == 0) 
      return; 
     else 
     { 
      myMethod(--counter); 
      System.out.println(""+counter); 
      return; 
     } 
    } 

    public static void main(String[] args) 
    { 
     rectest rec = new rectest(); 
     rec.myMethod(3); 
    } 
} 

和輸出

0 
1 
2 
+4

你問爲什麼輸出是0 1 2? – aioobe

回答

0

我們在課堂上它有點像多米諾骨牌一樣瞭解到關於以下鏈接(每個方法調用就像建立一個多米諾骨牌)。當你有

void myMethod(int counter) 
{ 
    if(counter == 0) 
     return; 
    else 
    { 
     myMethod(counter-1); 
     System.out.println(""+counter); 
     return; 
    } 
} 

計數器在3進去,然後再2 1,一度反打的0它像多米諾骨牌一樣與先前稱爲是解決如此這般向後方法的其餘部分。
注 - 計數器vs計數器1此結果給出

1 
2 
3 
0

這樣做的原因是執行的函數棧。 myMethod的每個呼叫都會「停止」,以便內線呼叫應該先完成。這是訂單的原因。

如果切換這兩條線的地方:

myMethod(--counter); 
System.out.println(""+counter); 

你會得到所需的輸出:3,2,1

+0

你說「myMethod的每個調用都是」停止「,這樣內部調用應該先完成」,這意味着所有遞歸函數都以這種方式運行? –

+0

@SalmanKhatibpour:**每個方法調用**都以這種方式工作。如果您調用某個方法,那麼在您的程序繼續調用方法中的代碼之前執行該方法。遞歸不會改變這一點。 – fabian

+0

調用myMethod(3)相當於調用: myMethod(myMethod(myMethod(myMethod(0)))) 它們必須從內部解析出來,才能提供給調用者。 – lscoughlin