漢諾塔問題:有三根柱子a,b,c,其中a上面有n個圓盤,從上至下圓盤逐漸增大,每次只能移動乙個圓盤,並且規定大的圓盤不能疊放在小的圓盤上面,現在想要把a上面的n個圓盤全部都移動到c上面,輸出移動的總步數以及移動的過程
分析:
//先求出移動的總步數
1,假設g(n)表示n個圓盤時的移動總的步數,當n=1時,g(1)=1
;2.現在可以把g(n)進行細分為三步:
1>先將n-1個圓盤從a通過c移動到b上面,相當於將n-1個圓盤從a移動到c,因此需要g(n-1)步;
2>然後將剩下的最大的圓盤從a移動到c,需要1步;
3>最後再將n-1個圓盤從b通過a移動到c上面,相當於將n-1個圓盤從a移動到c,因此也需要g(n-1)步;
因此可以得出遞迴關係式:g(n) = 2*g(n-1)+1
;//現在我們在來求出移動的過程
1.假設hm(m,a,b,c)表示將m個圓盤從a通過b移動到c的過程,假設mv(a,c)輸出一次a到c的過程,即print a-->c
2.初始化hm,當m=1時,hm(1,a,b,c)=mv(a,c);
2.可以把hm(m,a,b,c)進行細分為三步:
1>先將n-1個圓盤從a通過c移動到b,此時b和c進行互換,也就是 hm(m-1,a,c,b);
2>然後將剩下的最大的圓盤從a移動到c,也就是hm(1,a,b,c);
3>最後將n-1個圓盤從b通過a移動到c,此時b和a進行交換,也就是 hm(m-1,b,a,c);
最終得到過程的遞迴關係式:hm(m,a,b,c) = hm(m-1,a,c,b)+1+hm(m-1,b,a,c);
實現**:
public
class test
//獲取總步數
public
intgetsum(int n)
//獲取移動的過程
public
void
hm(int m,char a,char b,char c)
//輸出一次移動的過程
public
void
move(char a,char c)
}
經典遞迴問題 漢諾塔
漢諾塔 漢諾塔問題第一次接觸時就感覺非常有趣,但是由於當時知識有限不能深刻地理解遞迴的含義,所以沒能繼續深究,現在來談一談吧。題目描述 漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在...
經典問題 漢諾塔(遞迴)
c 如下 法國數學家愛德華 盧卡斯曾編寫過乙個印度的古老傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只...
經典遞迴 漢諾塔問題
有三個柱子,三個盤子都在第乙個柱子上,現在要移到第三個柱子上,要求移動過程中盤子相對位置不變,小的還是在上,大的在下。思路 分兩步 1.將n 1個盤從乙個柱子移到另乙個柱子 借助另外乙個柱子 n 1 2.將1個盤子從乙個柱子移到另乙個柱子 用3個柱子移動n 1個盤子,目的 把所有盤子從x移到z vo...