2010-11-22 54 views
2

我的任務是添加一堆打印語句,以顯示Tower of Hanoi的完整輸出,以查看並理解它在幕後做了什麼,而不僅僅是給出最終結果。河內塔顯示輸出。如何顯示第一次遞歸調用的1個選項卡,第二次遞歸調用的2個選項卡等?

class TowersApp { 
    static int nDisks = 3; 
    public static void main(String[] args) { 


     doTowers(nDisks, 'A', 'B', 'C'); 
    } 

    public static void doTowers(int topN, char from, char inter, char to) { 
     int i = 0; 

     if(topN==1) { 
      System.out.println("Enter (" + topN + " disk): " + "s=" + from + ", i=" + inter + ", d=" + to); 
      System.out.println("Base case: move disk " + topN + " from " + from + " to "+ to); 
      System.out.println("Return (" + topN + " disk)"); } 
     else { 
      System.out.println("Enter (" + topN + " disks): " + "s=" + from + ", i=" + inter + ", d=" + to); 
      doTowers(topN-1, from, to, inter); 
      System.out.println("Move bottom disk " + topN + 
        " from " + from + " to "+ to); 
      doTowers(topN-1, inter, from, to); 
      System.out.println("Return (" + topN + " disks)"); 

     } 
    } 
} 

這是我的輸出。我唯一缺少的是縮進。我需要有1片遞歸的第一級,2個標籤遞歸的第二級等等......這裏就是我的意思是:

電流輸出:

Enter (3 disks): s=A, i=B, d=C 
Enter (2 disks): s=A, i=C, d=B 
Enter (1 disk): s=A, i=B, d=C 
Base case: move disk 1 from A to C 
Return (1 disk) 
Move bottom disk 2 from A to B 
Enter (1 disk): s=C, i=A, d=B 
Base case: move disk 1 from C to B 
Return (1 disk) 
Return (2 disks) 
Move bottom disk 3 from A to C 
Enter (2 disks): s=B, i=A, d=C 
Enter (1 disk): s=B, i=C, d=A 
Base case: move disk 1 from B to A 
Return (1 disk) 
Move bottom disk 2 from B to C 
Enter (1 disk): s=A, i=B, d=C 
Base case: move disk 1 from A to C 
Return (1 disk) 
Return (2 disks) 
Return (3 disks) 

所需的輸出:

Enter (3 disks): s=A, i=B, d=C 
    Enter (2 disks): s=A, i=C, d=B 
     Enter (1 disk): s=A, i=B, d=C 
      Base case: move disk 1 from A to C 
     Return (1 disk) 
    Move bottom disk 2 from A to B 
Enter (1 disk): s=C, i=A, d=B 
................................... 

我需要某種計數器來「計數」我進入函數的次數嗎?但是,那甚至可以用遞歸?也許我在分析什麼時候有更簡單的解決方案來解決這個問題?

回答

2

最簡單的,雖然可能不雅,辦法是隻通過遞歸深度作爲一個整體參數的功能,並與深度的每一個新的水平增加它:

public static void doTowers(int topN, char from, char inter, char to, int depth) 

.... 

doTowers(..., depth + 1) 
doTowers(..., depth + 1) 

0開始,瞭解主要功能的深度。然後,每打印一個\tdepth

+0

這是一個非常愚蠢的問題,但我如何打印\ t深度= 1,\ t \ t深度= 2,\ t \ t \ t深度= 3? – 2010-11-22 16:29:01

1

當然,櫃檯很好地解決了這個問題。你如何沿遞歸獲得它?簡單,將其作爲參數傳遞!

2

一個簡單的方法是添加一個名爲indent的字符串參數,以創建所有輸出的前綴。來自main的調用會傳遞一個空字符串,doTowers中的每個調用都會爲該參數添加空格或製表符(即doTowers(indent+" ",...))。你會改變每個System.out.println(...)System.out.println(indent+...)

1

爲什麼不傳遞一個額外的參數,每增加一個遞歸調用?

public static void doTowers(int topN, char from, char inter, char to, int depth) 

,後來

doTowers(topN-1, from, to, inter, depth+1); 

深度會告訴你有多少個標籤使用。第一個電話會以0深度。

相關問題