python漢諾塔演算法具體過程,例如n 3?

時間 2021-05-12 01:29:28

1樓:

把n個盤子從a移到c,借助中介b。這個操作記為move(n, a, b, c)

因為一次只能移動乙個,那麼最先做的就是把最下面的移到c,所以需要把n-1個都移到b(此時中介是c)。因此有一步move(n-1, a, c, b)

現在,可以把那一塊最大的從a直接移動到c了。然後,a沒有,b有n-1個,c有乙個(最大的)。

現在的目標就是把n-1個盤子從b移動到c了,中介是a。參考最上面的寫法,這個就是move(n-1, b, a, c)

總結一下:如何移動呢?先把n-1個放中間,最大的拿過去,再把n-1個拿過去,只不過位置引數變了。每次呼叫兩個遞迴,複雜度是指數級別

2樓:

遞迴的要訣是:只關注問題和子問題的遞推關係(類似遞推數列的遞推關係)和遞迴出口;不要陷入遞迴遞迴再遞迴的邏輯漩渦中。

漢諾塔問題

找遞推關係:

如果我有 n 0 0 的漢諾塔,目標當然是變成 0 0 n

怎麼搞?

假設我已經解決了 n-1 時的漢諾塔問題,實際上我就是擁有了由一根柱子向另一根柱子移動 n-1 層漢諾塔的能力;所以我只要遞推到 n-1 的情況就好了。最下面那層的先忽略,不去動他,由 n 0 0,遞迴的變為 1 n-1 0,然後再變為 0 n-1 1,然後再變為 0 0 n;

遞推關係有了,出口呢,為 1 的時候很簡單了。

這裡要注意的是,由於三根柱子不具有對稱性(第一根輸入,第三根輸出,不能隨意交換位置),所以要明確輸入、中間值、輸出的柱子順序。

寫出來之後,3 層的情況怎麼模擬呢?

按照我剛說的,只關注遞推關係,也就是 3 層漢諾塔向 2 層漢諾塔變化的關係

h(3, x, y, z) = h(2, x, z, y) => x -> z => h(2, y, x, z)

然後再去拆解中間步驟的 h(2, x, z, y) 和 h(2, y, x, z)

h(2, x, z, y) = h(1, x, y, z) => x -> y => h(1, z, x, y)

h(2, y, x, z) = h(1, y, z, x) => y -> z => h(1, x, y, z)

各種 h1 的很簡單明瞭

h(1, x, y, z) = x -> z

h(1, z, x, y) = z -> y

h(1, y, z, x) = y -> x

然後逐層替換掉上面的,有

h(2, x, z, y) = x -> z => x -> y => z -> y

h(2, y, x, z) = y -> x => y -> z => x -> z

進而h(3, x, y, z) = x -> z => x -> y => z -> y => x -> z => y -> x => y -> z => x -> z

嗯,簡單過了下最後結果,完美!

有多少人知道漢諾塔其實應該叫河內塔?

原來河內不是音譯啊,我還以為是拼音呢,根本一模一樣誒。譁眾取寵的小丑,你不如去和徐志摩說他翻譯錯了,翡冷翠應該叫佛羅倫斯,再別康橋應該是再別劍橋。快去。可能你的名字也是音譯的吧?中文翻譯應該叫zz,有多少人知道? wolfgang 1984年翻譯的 演算法 資料結構 程式 一書之中,是翻譯成河內塔的...

初學者如何深入理解漢諾塔問題?

gongxy21 今天我也看到遞迴了。我的思路如下,遞迴源於歸納,當n等於1時,推出結果。當n等於t 1時推出結果,並能由此推出,當n等於t時也推出結果,即M t 能表達出M t 1 的關係。第一步確定漢諾塔的結果是什麼。漢諾塔的結果就是當有幾個圓盤在原柱子時,結果就是就把這些柱子移到目標柱子。展開...

無法理解漢諾塔問題的遞迴,是不是與程式設計無緣了

SteveForever 記得才開始看漢諾塔問題時,我是假設N 3,N 4,然後開始了畫圖找規律.後面用數學寫遞迴關係,發現很容易記住 理解 有N個盤子從A柱移動到C柱,以B柱為橋梁,設需要F N 次1 首先把N 1個盤子,從A柱移動到B柱,需要F N 1 次2 把A柱上的僅有的1個盤子,從A柱移動...