2016-09-27 28 views
-2

代碼的輸出是1,1,2,2 3,3,4,4,而不是1,2,3,4。我嘗試了很多不同的位置來使它變爲可用,但這是我得到的最接近的。我只是誤解了一些關於遞歸的基礎知識?如何在遞歸方法中不重複步驟列表?

import java.util.Scanner; 

public class TowerOfHanoi { 

    public static int a = 1; 

    public static void main(String[] args) { 

     TowerOfHanoi towerOfHanoi = new TowerOfHanoi(); 

     System.out.println("Enter number of disks: "); 

     Scanner scan = new Scanner(System.in); 
     int disks = scan.nextInt(); 

     towerOfHanoi.solve(disks, "1", "2", "3"); 

     scan.close(); 
    } 



    public void solve(int n, String start, String mid, String end){ 

     if(n == 1){ 

      System.out.println(a + " : "+ start + " to " + end); 

      a++; 

     } else { 
      solve(n-1, start, end, mid); 

      System.out.println(a + " : " + start + " to " + end); 

      solve(n-1, mid, start, end); 
     } 
    } 
} 

輸出:

Enter number of disks: 
3 
1 : 1 to 3 
2 : 1 to 2 
2 : 3 to 2 
3 : 1 to 3 
3 : 2 to 1 
4 : 2 to 3 
4 : 1 to 3 
+0

你可以顯示整個輸出和所需的輸出嗎?有一件事是,你在每個遞歸調用兩次[solve(n-1,...)'直到n等於一個 – HorusKol

+0

謝謝Scott修復輸出。 –

+0

因爲當你到達遞歸的底部(n == 1)時,你只會增加一個,而你實質上是在鑽回到n == 2之前打印並再次調用求解 – HorusKol

回答

1

步驟的順序看我的權利,但你忘了增加aelse子句中solve(...)

解決應該是這個樣子:

public void solve(int n, String start, String mid, String end) { 
    if (n == 1) { 
     System.out.println(a + " : "+ start + " to " + end); 
     a++; 
    } else { 
     solve(n-1, start, end, mid); 
     System.out.println(a + " : " + start + " to " + end); 
     a++; 
     solve(n-1, mid, start, end); 
    } 
    } 
0

a應在每次println後遞增,而不僅僅是第一。

+0

能否詳細說明爲什麼,這將是非常有用的。 –

+1

'a'用於計算步數;每個'println'都是一個步驟。 –