前情提要:
首先說一下漢諾塔游戲的規則:如下圖所示,有三個柱子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