java菜鳥---------用java寫的漢諾塔問題程式
漢諾塔是遞迴裡最經典的題。
漢諾塔問題:大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
這個問題可以理解為:三個柱子分別是A,B,C.將A上的盤子最終全部移到到C.
如果只有一個盤子,直接將只需要一步1.A->C(A最上邊的盤子移到到C的意思後邊不在寫字),如果是兩個1.A->B 2.A->C 3.B->C.如果是3個1.A->C,2.A->B 3.C->B 4.A->C.5.B->A 6.B->C 7.A->C
這時就出現了一個特點:兩個盤子的時候移法1.A->B 2.A->C 3.B->C.三個盤子的時候移法1.(1.A->C,2.A->B
3.C->B)2.(.A->C.)3.(5.B->A 6.B->C 7.A->C)可以把三個盤子時也看成三步,123為一步,4一步,567一步。第一步是幹嘛呢?就是將(3-1)個盤子A移動到B,第二步將A中最後一個也是最大一個盤子移到到C,最後一步將B上(3-1)盤子移到C。4個盤子5個盤子。。。。等所有你們可以把這些移到看出3個大步驟,你們可以將4個盤子的步驟全部列出來也可以這樣分為3個大步。
所以1.A當一個盤子時盤子從A->C
2.當兩個盤子和兩個盤子以上時都可以分為三步,設盤子為n第一步:將(n-1)個盤子A移到B 第二步將A的最後一個盤子移到C 第三步:將B上所有盤子移到C。
為此可以列出一個方程:
1. A->C n=1;
F(n)=2 f(n-1) A->B
A->C
f(n-1) B->C n>=2
分段函式大括號不知道如何打不要介意。
程式碼如下:
public class learn3 {
public static void main(String[] args) {
learn3 learn3=new learn3();
//數字為幾個盤子,ABC為3個柱子
learn3.go(2,'A','B','C');
}
public void go(int n,char A,char B,char C){
//當n=1時移法
if(n==1){
System.out.println(A+"->"+C);
return ;
}
//n>=2的移法
go(n-1, A, C,B);//先把A柱子上n-1個盤子通過C移動到B
System.out.println(A+"->"+C);//將A柱子上最後一個盤子移到到C
go(n-1, B, A, C);//最後把B柱子上所有的盤子移到到C
}
}
若有不足地方請各位大佬指點
一個努力成為程式設計師的學生