思路推導:
從兩個圓盤開始,假設三根插柱分別為 a b c,目標柱為c,那麼輔助柱為b,(當然了也可以目標柱為b,輔助柱為c)。
首先將小的移動到b,然後將大的移動到c,再然後移動小的到c
至此兩塊圓盤的情況講解完成。
接下來,三塊呢?
我們參照上述二個圓盤的思路,將三塊分為兩組,最大的為一組,中和小為一組,分別對應著兩個圓盤情況時的大圓盤,小圓盤,也就是說,將大圓盤看成乙個整體,中圓盤和小圓盤看成乙個整體。
我們知道兩塊圓盤時的思路:
首先將小的移動到b,然後將大的移動到c,再然後移動小的到c
按照這個思路走,
首先將小的移動到b:這裡的小 實際包含兩個圓盤,而兩個圓盤的移動的思路本來我們就已經知道了,
因為是從a移動到b,顯然輔助柱只能是c, 首先將小的移動到c, 然後將大的移動到b,再然移動小的到b(這裡的大小對應著中小,為了體現遞迴的本質,我用了大小而不是中小),此時完成了將兩塊圓盤移動到b。
然後將大的移動到c:這裡不做過多解釋……因為就乙個盤
再然後移動小的到c:因為是從b移動到c,所以輔助柱是a。這裡我用中小來講解,首先移動小的到a,然後移動中盤到c,再然後移動小盤到c。
至此,三塊圓盤移動完成。
四塊呢?
大概講下,四塊分成 兩份, 最大的乙份,其餘三塊乙份。 然後以c為目標柱的話,先把三塊移動到b,再移動單獨那塊到c,最後移動那三塊到c。然後移動三塊**又可以參照上文的……如此遞迴!
最後附上**
#include
//這裡以a為初始柱,c為目標柱
void
hanoi
(int n,
char a,
char b ,
char c)
//分別對應圓盤數,插柱。插柱分別為初始位置,輔助位置,目標位置
}int
main()
遞迴實現漢諾塔問題
遞迴的思想是將乙個大的複雜的問題分成小的問題來解決,而要求是小的問題與大的問題有相似的解法,並且問題的規模越來越小,並且必須存在遞迴出口。下面就用 完成漢諾塔問題 總結 通過遞迴實現漢諾塔的例子我們可以看出,在涉及大型而複雜的問題時,遞迴會使程式在總體上變得簡單易於理解,而涉及遞迴的呼叫過程時則會比...
漢諾塔問題 遞迴實現
一共就三步 把 n 1 號盤子移動到緩衝區 把1號從起點移到終點 然後把緩衝區的n 1號盤子也移到終點 所以寫成py 就是 def move n from buffer,to ifn 1 print move n from from to to else move n 1,from,to buffe...
漢諾塔問題(遞迴實現)
漢諾塔 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。三根柱子定義為a ...