2012-02-12 34 views
1

我仍然有問題要了解古代問題河內遞歸塔如何在這裏真正起作用。我已經從理論上讀了它,但我仍然不明白遞歸是如何在這裏被調用的。任何人都可以解釋每一步是怎麼回事,對前如果環的值爲2需要一些關於遞歸的解釋?

總的來說,我知道,遞歸調用本身,而是我在這裏卡住:

public static void main(String[] args) { 
// TODO Auto-generated method stub 
    Scanner s = new Scanner(System.in); 
    System.out.println("Input the number of rings"); 
    int rings = s.nextInt(); 
    move(rings, 'A', 'B', 'C'); 
} 

public static void move(int rings, char x, char y, char z){ 
    if(rings > 0){ 
     move(rings - 1, x, z, y); 
     System.out.println("Move ring " + rings + " from peg " + x + " to " + y + "."); 
     move(rings - 1, z, y, x); 
    } 
} 

爲什麼當我給環值1它直接到這條線:

System.out.println("Move ring " + rings + " from peg " + x + " to " + y + "."); 

謝謝。

+4

不知道你在問什麼。它會調用move(0,'A','C','B'),它不會做任何事情(因爲它不符合條件)。然後它會繼續調用輸出行。你能澄清你的問題嗎? – 2012-02-12 00:50:48

回答

2

當環的值是1,會發生什麼情況如下:

-move方法被稱爲與-the條件被滿足環= 1
(因爲1> 0爲真),從而移動被稱爲0 =
- 移動方法的另一個實例開始,但是這次是rings = rings - 1 = 0
- 條件不符合(因爲0> 0爲false)因此沒有任何反應,並且該方法結束
- 我們回到了方法的第一個實例。現在,執行系統調用
-之後,移動被再次調用,其中ring = rings - 1 = 0
- 方法的另一個實例啓動,並且條件不再滿足(0> 0爲false) ,因此方法終止而不輸入「if」塊

如果環等於2,則會發生同樣的情況,但會發生更大且更復雜的遞歸樹。其中環上的移動方法是將2的呼叫2種移動方法,其中環等於1,這將自己的呼叫2種移動方法的每個,其中環是0

 2 
    /\ 
    1  1 
/\ /\ 
0 0 0 0 

一步一步,與環= 2,這將發生:
-move(1,x,z,y);移動(0,x,z,y);移動(0,x,z,y);移動(0,x,z)。
-System.out.println(「將環1從掛鉤A移至C」);
-move(0,z,y,x);
-System.out.println(「將環2從掛鉤A移動到B.」); (1,z,y,x);移動(0,x,z,y);移動(0,x,z,y);移動(0,x,z)。
-System.out.println(「將環1從掛鉤C移動到B.」);
-move(0,z,y,x);

每次調用中環的值會給出它發生位置的提示。例如,
move(1,x,z,y);發生在rings = 2的方法中,因爲調用是移動的(rings-1,x,z,y)。

我希望這會有所幫助。

+0

在第5行,ring值如何變成2?當你說: syso(將環2從掛鉤A移動到B) – Samuel 2012-02-12 11:09:59

+0

有人可以用更好的explonation編寫相同的代碼,我可以知道在這種情況下遞歸如何工作? – Samuel 2012-02-12 11:15:03

+0

在第5行中,ring是2,因爲它發生在參數爲2的方法實例中。每次進行遞歸調用時,方法的新實例「出現」並運行。呼叫的方法仍然存在,但在新呼叫完成之前被阻止。嘗試繪製所有發生的實例,然後嘗試將我編寫的序列的每一行與其中一個實例鏈接起來。 – broncoAbierto 2012-02-12 18:23:15