一、問題背景
漢諾塔問題是源於印度一個古老傳說。
源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
簡單來說目的就是要我們把盤子按照規則從A移到C
二、思路
此處我用遞歸的思想理解漢諾塔問題。遞歸的思想容易理解,但是運用在代碼上的算法並不是解決漢諾塔問題的最佳算法。
我們初定有n個盤子,把三個盤子從左到右分別標為A,B,C。
我們先思考,如果只有一個盤子放在A柱,要移動到C,應該A-->C
(1)首先根據大的盤子在下,小的盤子在上的目標,我們倒着想,想到要移動A最下面的盤子。要把A最下面的盤子移動到C,首先要把前n-1個盤子移動到B
(2)然后可以把第n盤從A移動到C了
之后我們把B柱位置與A柱位置互換,我們可以發現忽略C中的盤子后,問題變為了n-1個盤子的漢諾塔問題
之后我們可以重復以上步驟,直至問題化為單一的盤子移動(從A到C)。
三、python代碼
此處我編寫了一個hanoi函數和move函數去顯示n個盤子的運動軌跡
n=eval(input())
def move(p,q):
print(p,'-->',q)
def hanoi(n,a,b,c):
if n==1:
move(a,c)
else:
hanoi(n-1,a,c,b)
move(a,c)
hanoi(n-1,b,a,c)
hanoi(n,'A','B','C')
四、效果
5個盤子的移動軌跡顯示