Java遞迴例題:漢諾塔問題
阿新 • • 發佈:2021-01-20
要求
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