對漢諾塔遞歸算法的理解(圖解,附完整代碼實現)


前情提要:

首先說一下漢諾塔游戲的規則:如下圖所示,有三個柱子A,B,C,我們要做的是把A柱的所有圓盤,全部轉移到C柱上,轉移時遵循的規則如下:

1、每次只能移動一個圓盤

2、所有的大圓盤必須在小圓盤的下面

 過程分析

首先假設只有一個圓盤,我們將其編號為1,如下圖所示,那么這時候只需要將A直接移到C即可:

再假設有兩個圓盤,我們看到移動過程如下:

步驟1:先將1號盤從A移動到B;

步驟2:再將2號盤從A移動到C;

步驟3:最后將1號盤從B移動到C,完成轉移。

好了,請讀者有點耐心,我們再看看三個圓盤的轉移過程是怎樣進行的:(此處用文字進行描述,請讀者發揮想象)

首先三個圓盤放在A柱上,按從上到下的順序依次編號為1,2,3(最小的為1,最大的為3),我們先不考慮3號盤,而只考慮上面兩個小一點的圓盤(編號1,2),而此前我們已經分析了兩個圓盤的移動過程,那么這兩個圓盤該移動到哪根柱子呢?目前只有B柱,C柱可選,而C柱肯定不行,因為C柱是目標柱,那么我們只能把1,2號盤從A柱移動到B柱,借助C柱,則移動過程為:A->C, A->B,C->B。此時,1,2號盤已經到達B柱,再把最大的三號盤,直接移到C柱。此時工作快要完成了,目前的狀態為:1,2號盤在B柱,3號盤已到達目的柱C柱,再接下來,把1,2號盤將B柱移動到C柱,轉移工作就徹底結束,借助A柱,轉移過程為:B->A,B->C,A->C。

通過上面第一段加紅的文字,我們可以知道,A是作為起始柱,B作為目標柱,C作為輔助柱,通過第二段加紅文字,我們可以知道,B是作為起始柱,A作為輔助柱,C作為目標柱。

那么此時,函數的寫法,在腦海里大概就有了形狀

 函數定義

根據上面的分析,我們知道,函數的參數,有盤子,A,B,C三個柱子,所以,函數的簽名為:move(n, a, b, c)。其中n表示圓盤的個數,a表示起始柱,b表示輔助柱,c表示目標柱。

根據上面對三個圓盤的分析,可得函數定義如下(Python代碼):

1 def move(n, a, b, c):
2     if n == 1:
3         print a + '-->' + c
4         return
5     move(n - 1, a, c, b)
6     print a + '-->' + c
7     move(n - 1, b, a, c)

代碼解釋:

  當n=1時,即當只有一個圓盤時,直接輸出a -> c,即將圓盤從A移動到C(對應第2,3行代碼)

  當n>1時,就先處理前n-1個圓盤,將前n-1個圓盤從a移動到b柱,借助c柱(對應第5行代碼),然后將第n個圓盤從a柱移動到c柱(對應代碼第6行),最后將剩下的n-1個圓盤,將b柱移動到c柱,借助a柱(遞歸思想,請讀者聯合上面對三個圓盤的分析仔細斟酌)

調用代碼如下:(4個圓盤)

1 move(4, 'A', 'B', 'C')

結果如下:

A-->B
A-->C
B-->C
A-->B
C-->A
C-->B
A-->B
A-->C
B-->C
B-->A
C-->A
B-->C
A-->B
A-->C
B-->C


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM