1. 程式人生 > 其它 >Java遞迴例題:漢諾塔問題

Java遞迴例題:漢諾塔問題


要求

1、從A通過B移到C上

2、移動過程中,小盤子必須在大盤子上;

分析

1、一個盤子:直接 A->C

2、兩個盤子:A->B A->C B->C

3、三個盤子:A->C A->B C->B A->C B->A B->C A->C

A->C A->B C->B

A->C B->A B->C A->C

4、四個盤子:過程中也是先要做到如圖(從A移動三個盤子到B),然後A->C,至於如何將三個盤子從A 到B,這個過程與上邊(三個盤子從A 藉助B到C)類似,我們可以看做是三個盤子從A 藉助從C移動到B。

然後考慮如何將B上的三個盤子移動到C,類似的可以想到 三個盤子從B 藉助A 移動到C。

  • 更多盤子也是類似的移動方法,只要A上多於一個盤子,我們就先將N-1個盤子從A藉助C移動到B上,再A->C,繼續將N-1個盤子從B藉助A移動到C上。

我們可以發現,過程中有一個類似的過程,n個盤子從 pos1 藉助 pos2 移動到 pos3 ,我們可以將這個過程單獨寫成一個方法,這個方法使用遞迴寫,終止條件是隻有一個盤子要移動的時候。

程式碼

public class TestDemo {
    public static void main(String[] args) {
        hanota(1,'A','B','C');//測試一個盤子
        System.out.println();
        hanota(2,'A','B','C');//兩個
        System.out.println();
        hanota(3,'A','B','C');//三個
    }
    public static void move(char pos1,char pos2){//輸出
        System.out.print(pos1+"->"+pos2+" ");
    }
    public static void hanota(int n,char pos1,char pos2,char pos3){
        //n:移動的盤子的個數
        // n個盤子 從 pos1(起始位置) 藉助 pos2(中途位置) 移動到 pos3(目的位置)
        if(n==1){
            move(pos1,pos3);
        }
        else{
            hanota(n-1,pos1,pos3,pos2);
            move(pos1,pos3);
            hanota(n-1,pos2,pos1,pos3);
        }
    }
}
//執行結果
A->C 
A->B A->C B->C 
A->C A->B C->B A->C B->A B->C A->C