問題:漢諾塔
problem description:
漢諾塔(又稱河內塔)問題是印度的乙個古老的傳說。
開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒a、b和c,a上面套著n個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從a棒搬到c棒上,規定可利用中間的一根b棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。
僧侶們搬得汗流滿面,可惜當n很大時這輩子恐怕就很搬完了。
聰明的你還有計算機幫你完成,你能寫乙個程式幫助僧侶們完成這輩子的夙願嗎?
input
輸入金片的個數n。這裡的n<=10。
output
輸出搬動金片的全過程。格式見樣例。
sample input
2
sample output
move disk 1 from a to b
move disk 2 from a to c
move disk 1 from b to c
漢諾塔問題,是函式遞迴演算法中最為經典的案例,其解法的唯一性使其成為了遞迴演算法講解和練習中的「必考題」。今天,再次重新回顧了一遍漢諾塔問題(竟然搞了辣麼久),其中所犯的錯誤和思路的重新梳理都讓我有了非常的大的收穫。
題目分析:
本題最重要的思想:
首先我們拿到題都會選擇使用歸納法,因此我們不妨先帶入n=1,也就是只有乙個金片的時候,顯然,我們只需要將這個金片從a——>c即可(so easy!(●ˇ∀ˇ●))。此時還很難抽取規律,因此我們再帶入n=2,也很容易的得出把disk1 a——>b,disk2 a——>c,disk1b——>c,
當n>=3時,想再一一枚舉已經有些困難了,因此我們從中抽取規律。我們可以利用整體思想,將上面部分的n-1個看作乙個整體,第n個單獨乙個整體,於是移動n個金片的問題變成了移動上面n-1個移動到b,第n個金片移動到c,再把n-1個移動到c的問題,而上面的n-1個金片的每次移動,又可以看作時上面n-2個和第n-1個的分別移動……
這裡用到的便是遞迴(遞迴中的回溯)演算法。系不繫有一點凌亂,木關係,再看一邊鴨。(@_@;)!
然後說一下程式中的實現,首先是函式,這裡我所用到的一共有兩個,乙個是完成漢諾塔的遞迴邏輯的函式,另乙個是負責每次移動的列印的函式(其實,也可以再遞迴邏輯中順便列印粗來,,,多帥哦,小老闆d*****( ̄▽ ̄*)b)
我們遞迴邏輯函式中先是放入了金片的數目(或者說是金片的編號),然後是三根棒(bang1,2,3),這裡我是將需要空出的棒放在中間位置(都可以相互調整但要注意在遞迴函式中移動方向,空出的棒要一一對應)
#include
void
hanoi
(int n,
char bang1,
char bang2,
char bang3)
;void
move
(int n,
char bang1,
char bang3)
;int
main()
void
hanoi
(int n,
char bang1,
char bang2,
char bang3)
else
}void
move
(int n,
char bang1,
char bang2)
最後說一下我為什麼又選擇使用乙個專門的函式去列印每個移動過程,,因為,,直接嵌在遞迴函式裡面非常容易弄錯,比如方向等問題。而設立的這個列印函式,只需要考慮他的move方向即可。
總的來嗦,這次的漢諾塔問題回顧,讓我更加深刻的理解了遞迴函式的意義及用法。
( ̄y▽ ̄)╭ ohohoho…,,。
漢諾塔的問題
參考 漢諾塔 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定 在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。假...
漢諾塔作業與內在邏輯的思考
def hano n,a,b,c if n 1 print a,挪移到 c return none if n 2 print a,挪移到 b print a,挪移到 c print b,挪移到 c return none n代表了挪移的柱子數,第二個引數為起始點,第三個引數為借助的平台,第四個引數為...
有趣的漢諾塔問題
乙個只能用遞迴的方法來解決的問題,問題描述 有三根標號為a,b,c的柱子,在a上放著64個金盤,每乙個都比下面的略小,現在需要把a柱上的盤子全部移到c柱上,移動的條件是 一次只能移動乙個金盤,移動過程中大金盤不能放在小金盤的上面 結題思路 設a柱上盤子總數為n,如果n 1,則將盤子從a移到c,否則執...