相傳在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
該問題實際上是乙個非常典型的迭代問題,所謂迭代問題就是原問題拆分的子問題實質上仍然是原問題,此外,每個迭代問題都應該有乙個base case,即在此情況下停止迭代。
用迭代的角度來看漢諾塔問題:
def transfer(n,start=1,end=3):
if n:
transfer(n-1,start,6-start-end) # 將n-1個金片從start轉移到6-start-end
print('move disk %d from rod %d to rod %d '%(n, start,end))
transfer(n-1,6-start-end,end)# 將n-1個金片從6-start-end轉移到end
output:
transfer(3)
move disk 1 from rod 1 to rod 3
move disk 2 from rod 1 to rod 2
move disk 1 from rod 3 to rod 3
move disk 3 from rod 1 to rod 3
move disk 1 from rod 2 to rod 1
move disk 2 from rod 2 to rod 3
move disk 1 from rod 1 to rod 3
transfer(4)
move disk 1 from rod 1 to rod 2
move disk 2 from rod 1 to rod 3
move disk 1 from rod 2 to rod 3
move disk 3 from rod 1 to rod 2
move disk 1 from rod 3 to rod 0
move disk 2 from rod 3 to rod 3
move disk 1 from rod 0 to rod 3
move disk 4 from rod 1 to rod 3
move disk 1 from rod 2 to rod 3
move disk 2 from rod 2 to rod 1
move disk 1 from rod 3 to rod 3
move disk 3 from rod 2 to rod 3
move disk 1 from rod 1 to rod 2
move disk 2 from rod 1 to rod 3
move disk 1 from rod 2 to rod 3
需要注意幾點: 經典漢諾塔問題
這幾天在家看完了 程式設計師的數學 這本書,裡面的內容深入淺出比較容易理解,將乙個個晦澀的數學概念用經典例題講解,使人不覺得枯燥。這本書看第一遍有兩處地方卡殼,不是很懂,再看第二遍大致能捋清了,其中乙個就是我這篇文章要講的經典漢諾塔問題。漢諾塔是乙個由數學家愛德華 盧卡斯 edward lucas ...
經典漢諾塔問題分析
漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動乙個圓盤,只能移動在最頂端的圓盤。有預言說,這件事完成時宇宙會...
經典遞迴問題 漢諾塔
漢諾塔 漢諾塔問題第一次接觸時就感覺非常有趣,但是由於當時知識有限不能深刻地理解遞迴的含義,所以沒能繼續深究,現在來談一談吧。題目描述 漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在...