2016-05-09 47 views
-1

我一直在嘗試創建一個程序來解決河內的塔使用遞歸思維。我在網上看了很多,無法弄清楚爲什麼代碼不斷打印出錯誤的東西。這裏是我到目前爲止有:河內遞交的塔

public static void tower(int start, int finish, int helper, int number) 
     { 
     if(number == 1) 
      System.out.println("Move disk 1 from "+start+" to "+finish+"."); 
     else 
     { 
      tower(start, finish, helper, (number - 1)); 
      System.out.println("Move disk "+number+" from "+start+" to "+finish+"."); 
      tower(helper, start, finish, (number - 1)); 
     }  
     } 
    } 

,但會將打印出來:

Move disk 1 from 1 to 3. 
Move disk 2 from 1 to 3. 
Move disk 1 from 2 to 1. 
Move disk 3 from 1 to 3. 
Move disk 1 from 2 to 1. 
Move disk 2 from 2 to 1. 
Move disk 1 from 3 to 2. 

有什麼建議?

+2

我要縮進的代碼,但你有更多的結束括號比開放括號。你能檢查你複製的代碼是否正確?另外,我們需要看看你是如何調用這個函數來真正回答你的問題的。請閱讀本頁,以瞭解我們需要從您那裏得到一個很好的答案:http://stackoverflow.com/help/mcve –

+0

首先,你確定它是'數字== 1'而不是'數字== 0' ?一般來說,如果你有3個磁盤,它們將是0,1,2。其次,它看起來像遞歸參數是錯誤的。例如,我*認爲*(沒有做很多調試),第一次遞歸調用應該是'塔(開始,幫手,結束,(數字-1));'。您應該仔細檢查這裏的算法。 – KevinO

回答

0

這應該工作:

public static void tower(int start, int finish, int helper, int number) 
     { 
     if(number == 1) 
      System.out.println("Move disk 1 from "+start+" to "+finish+"."); 
     else 
     { 
      tower(start, helper, finish, number-1); 
      System.out.println("Move disk "+number+" from "+start+" to "+finish+"."); 
      tower(helper, finish, start, number - 1); 
     }  
     } 

輸出爲tower(1, 3, 2, nDisks);

Move disk 1 from 1 to 3. 
Move disk 2 from 1 to 2. 
Move disk 1 from 3 to 2. 
Move disk 3 from 1 to 3. 
Move disk 1 from 2 to 1. 
Move disk 2 from 2 to 3. 
Move disk 1 from 1 to 3.