2016-03-07 170 views
2

我只是介紹了遞歸和我得到了下面的代碼行:遞歸輸出

public class RecursionThree 
{ 
    public void run(int x) 
    { 
     if(x<5) 
     run(x+1); 
     out.println(x); 
    } 
    public static void main(String args[] ) 
    { 
     RecursionThree test = new RecursionThree(); 
     test.run(1); 
    } 
} 

和輸出應該是:5 4 3 2 1,我得到它爲什麼會打印5(因爲5 <將等於false,它會打印x,即5)。但是,我不明白爲什麼它會打印4 3 2 1。感謝您的幫助

+0

你的輸出應該是'1 2 3 4 5',每個都在一個新行中。作爲一個概念的遞歸可以被看作是讓攝像機具有分離(實時)屏幕,其鏡頭指向其屏幕,其反過來顯示屏幕及其圖像在原始圖像的屏幕內不斷重複,除了每次較小。就像你的情況一樣。你的方法'run()'一次又一次地調用'run()',每次給它一個**更大的**號碼直到滿足條件(在這種情況下,直到數字是5)。 – shrmn

+0

輸出是5 4 3 2 1,每個都在一個新行(我運行代碼),但我想我現在得到它,謝謝 – JavaB

+2

@shrmn輸出不能是'1 2 3 4 5'。遞歸階段之後,而不是之前完成打印。這與你所說的「5 4 3 2 1」完全相反。發帖前請檢查。 –

回答

2

遞歸的工作原理是分解到基本情況並向後建立。在你的情況。您的基本情況是x>=5,它將停止擴展遞歸樹的位置,您可以將基本情況視爲樹的末尾或葉。之後,它回到完成在運行被調用之後要完成的事情。所以在你的情況下,每次調用一次後,它就會打印出x。

當x = 1時,它調用run(2),在解析run(2)後,它會轉到下一行。運行(2)後,打印輸出爲5 4 3 2,然後打印出x返回原來的電話run(1),這將是1。這對遍歷樹等非常好,還有很多其他問題。

圖片它,當你調用運行(1)

run(1) 
1<5 
    run(2) 
    2<5 
    run(3) 
    3<5 
     run(4) 
     4<5 
     run(5) 
      print(5) 
     print(4) 
    print(3) 
    print(2) 
print(1) 

正如你可以看到它去的基本情況,並備份。

要熟悉遞歸更多,你可以這樣做的問題,找到最大的INT與方法頭數組是public int findLargest(int [] array, int someNumber),你會用someNumber,無論你認爲你需要。或者使用遞歸和一個參數來反轉字符串。

+0

非常感謝,這幫了很多 – JavaB

+1

很高興幫助。你有關於遞歸的其他問題嗎? –

+0

還沒有,非常感謝你! – JavaB

2

對於您的x=4的情況,run(5)被調用。在完成運行後,控制返回到被調用函數,其中x現在爲4.因此,它在執行if後面的行處打印出4.對於x = 3,2,1,遵循相同的邏輯。

+0

如果它顯示「system.out.println(x)」並且x是5,是不是會打印5,然後停止,因爲「run」中沒有其他內容?我仍然不明白它爲什麼會一直迴歸,而且我到處都在尋找,我無法得到一個清晰的解釋。它是否打印「4,3,2,1」,因爲這些是以前的x值,在某些方面遞歸存儲這些值?希望你能幫助我,並感謝您的幫助 – JavaB

+2

@JavaB非常。如果你注意到,'run(x + 1)'被調用iff'x <5'。因此,對於x = 5的情況,不會調用run(6)。所以,我們不必擔心這一點。對於x = 5的情況,在檢查if條件之後,打印5。現在,我們完成了x = 5情況下的函數實例。時間回到x = 4的情況。該案例已經過評估。之後的行要求將4打印到控制檯。現在,我們完成x = 4情況下的函數實例。現在x = 3的情況..... –

+0

@JavaB這是否回答你的問題? –