漢諾塔問題的一點思考
阿新 • • 發佈:2018-12-12
漢諾塔問題是遞迴中常見的一類問題,剛開始接觸這類問題毫無頭緒,但是看了很多資料之後也慢慢發現了其中的一點規律
關於漢諾塔的一點傳說:漢諾塔問題是源於印度一個古老的傳說大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
分析:一共有n塊塔片,我們可以把他們想象成獨立的兩部分,分別是n-1片和1片,假設有三根從左到右編號為x,y,z的三根圓柱,所有的塔片都位於x柱上,n-1片在上,1片在下,現在我們需要通過y柱,z柱將塔片全部移動到z柱上。那麼n片的方案就簡化成了移動兩片的問題了。
注意:雖然是假設把n片塔片分成兩片,但是在n-1等於1之前,都需要通過第三根圓柱來協助n-1片從初始柱移動到目的柱
(1)移動n-1片,從x--->利用z--->y
(2) 移動1片,從x--->z
(3)移動n-1片,從y--->利用x--->z
實現程式碼:
#在這裡我們還可以設定一個用來計數的全域性變數a,以便於統計一共需要移動的次數,注意a放置的位置,每有一條輸出語句出現就需要把a加一
a = 0 def hanoi(n,x,y,z): global a # a += 1 if n==1:print(x,'--->',z) a += 1 else: hanoi(n-1,x,z,y) print(x,'--->',z) a += 1 hanoi(n-1,y,x,z) hanoi(3,'x','y','z') print(a)
x ---> z
x ---> y
z ---> y
x ---> z
y ---> x
y ---> z
x ---> z
7