Python中的漢諾塔遞迴演算法

2021-07-25 11:26:38 字數 1185 閱讀 7892

最近在學廖雪峰老師的python入門課程,到了遞迴這一節,漢諾塔的遞迴演算法讓我很是困惑,拜讀了一些前人的文章後終於開了竅,總結如下,也算是把自己的所思所想梳理一遍。

遞迴的組成有兩部分,乙個是遞迴體,乙個是遞迴結束條件。其本質在於重複,因此找到了重複的內容就能推導出遞迴體。

以漢諾塔為例,將三個柱子(初始柱,過渡柱,目標柱)分別標記為a,b,c,(注:這裡的柱子相當於實參,字母相當於形參)這個搬圓盤活動抽象後可分成三步:

1.將初始柱上除最下面的圓盤以外的圓盤全部搬到過渡柱上;

2.將初始柱上最下面的圓盤搬到目標柱上;

3.將過渡柱上的圓盤全部搬到目標柱上。這一步也可以看做是第一步的逆向操作。

一切搬圓盤都是在重複上面三個步驟,因此,這三步便是乙個遞迴體。下面將**表示出來:

def

move

(n,a,b,c):

if n==1:

print a,'-->',c

return

move (n-1,a,c,b)

print a,'-->',c

move (n-1,b,a,c)

舉例來說(可以畫圖理解),當a柱上有n個圓盤時,首先要把a上的(n-1)個圓盤放到b柱上,**如下:
move

(n-1,a,c,b)

這樣就可以把a上最下面的圓盤放在c上。
print a,'-->',c
然後再將(n-1)個圓盤從b移動到c上。
move

(n-1,b,a,c)

那麼這(n-1)個圓盤的移動也是一次遞迴過程,這次遞迴所要做的是把(n-2)個圓盤先從a柱移動到c柱上,然後把『第』(n-1)個圓盤移動到b柱上,再將c柱上的(n-2)個圓盤移動到b柱上,(注:這次的移動過程中,a柱為初始柱,c柱為過渡柱,b柱為目標柱。)

由此可以看出,這是乙個不斷重複的過程。需要注意的是不要被形參的變化搞糊塗了。當move (n-1,a,c,b)迴圈到n為1時,輸出結果,結束迴圈,然後開始move (n-1,b,a,c)的迴圈,直至結束。由此整個漢諾塔移動完成。

參考文章

漢諾塔 遞迴演算法

個人覺得漢諾塔這個遞迴演算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實網上也有很多 可以直接參考。記得大一開始時就做過漢諾塔的習題,但是那時 寫得很長很長,也是不理解遞迴的結果。現在想起來漢諾塔的演算法就3個步驟 第一,把a上的n 1個盤通過c移動到b。第二,把a上的最下面的盤移到c。第...

漢諾塔遞迴演算法

大學的時候專業課程很差,指導大二學習演算法設計的時候,發現專業課裡比較有趣的一門。專心學習了一學期 最近在學習python發現了乙個遞迴演算法很迷茫,遂研究了一下。簡單來說明一下 首先漢諾塔的規則是1 每次移動一塊 2 小木塊只能放在大木塊上 3 將所有木塊從a柱子移動c柱子木塊上 用幾個變數和常量...

遞迴函式 python中的漢諾塔遞迴演算法

遞迴函式 如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。def fact n if n 1 return 1return n fact n 1 首先我們要明確乙個概念,遞迴函式是從哪個函式開始執行之後就要返回哪個函式。每一次move都要從開頭進行計算,到n 1為 止。下面要不斷地返回move...