演算法題 漢諾塔問題

2021-10-01 22:55:37 字數 1364 閱讀 2314

www.i-search.com.cn/index.html?from=line1

《從一到無窮大》一書中提到乙個關於「世界末日」的問題。愛好數學的歷史學家 w.w.r. 鮑爾(w.w.w.r. ball)是這樣說的:

在貝拿勒斯那座偉大的神廟裡,代表世界中心的穹頂之下安放著一塊銅板,銅板上鑲有 3 根高 1 腕尺(約等於 20 英吋)、蜜蜂身體一般粗的金剛石針。神在創世時將 64 張純金圓片安放在其中一根針上,最大的金片直接放置在銅板上,其餘金片依次堆疊,逐漸縮小,這就是梵塔。值守的僧侶夜以繼日、從不停歇地將這些金片從一根金剛石針轉移到另一根金剛石針上。至於梵塔如何轉移,神定下了不可更改的鐵律:僧侶每次只能移動一張金片,所有金片必須安放在金剛石針上,較小的金片絕不能放在比它大的金片下面。等到全部 64 張金片都從創世時神安放的那根針轉移到另一根針上面,塔、神廟和婆羅門都將化為塵埃,世界也將在轟鳴的霹靂中歸於寂滅。

漢諾塔問題不管在任何程式語言裡都是經典問題,是採用遞迴演算法的經典案例,該問題可以抽象如下:

3 根圓柱 a,b,c,其中 a 上面串了 n 個圓盤

這些圓盤從上到下是按從小到大順序排列的,大的圓盤任何時刻不得位於小的圓盤上面

每次移動乙個圓盤,最終實現將所有圓盤移動到c上

利用 python 語言接近自然語言的特性,可以更容易的將遞迴演算法翻譯成程式語句,需要的**量很小。漢諾塔問題的解決步驟用語言描述很簡單,僅三步:

a,b,c 三個圓柱,分別為初始位,過渡位,目標位,設 a 柱為初始位,c 位為最終目標位

(1)將最上面的 n-1 個圓盤從初始位移動到過渡位

(2)將初始位的最底下的乙個圓盤移動到目標位

(3)將過渡位的 n-1 個圓盤移動到目標位

對於遞迴演算法中的巢狀函式 f(n-1)來說,其初始位,過渡位,目標位發生了變化

完整**如下:

def destory(n, begin=『a』, middle=『b』, end=『c』):

if n == 1:

print(』{}–>{}』.format(begin, end))

elif n == 2:

print(』{}–>{}』.format(begin, middle))

print(』{}–>{}』.format(begin, end))

print(』{}–>{}』.format(middle, end))

else:

destory(n-1, begin=『a』, middle=『c』, end=『b』)

print(『a–>c』)

destory(n-1, begin=『b』, middle=『a』, end=『c』)

演算法題 漢諾塔問題

三個柱子,起初有若干個按大小關係順序安放的盤子,需要全部移動到另外乙個柱子上。移動規則 在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。移動次數 f n 2n 1 使用遞迴演算法進行處理。漢諾塔的演算法大概有3個步驟 1 把a上的n 1個盤通過c移動到b。2 把a上的最下面的盤移到c。3...

演算法題 漢諾塔問題

問題描述 三個柱子,起初有若干個按大小關係順序安放的盤子,需要全部移動到另外乙個柱子上。移動規則 在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。移動次數 f n 2n 1 解法思路 使用遞迴演算法進行處理。漢諾塔的演算法大概有3個步驟 1 把a上的n 1個盤通過c移動到b。2 把a上的...

演算法題 漢諾塔

public static void moveplant int size,listfirst,listsecond,listthird 首先將n 1個盤子,從第乙個柱子移動到第二個柱子 moveplant size 1,first,third,second 然後將最後乙個盤子移動到第三個柱子上 t...