關於遞迴,必須了解其關鍵的思想,重複相同的動作,但處理的卻是不同的資料,在幾乎所有我所見過的遞迴函式中,都是這樣. 幾乎都是讓資料之間進行交換,然後以相同的「機器」去加工.
故此引入著名的tower of hanoi:
#include
void hanoi(int n, char a, char b, char c)
else
}void main()
觀察**,
第乙個遞迴語句,交換後兩個目標(塔)
第二個遞迴語句,交換前兩個目標(塔)
通過一步步的執行,我們也同樣會發現,第乙個遞迴語句呼叫並返回初始時,正是把n-1個(最大的盤子的上邊所有的)盤子移到了別的柱子上.
此時,我們就要從漢諾塔的具體情況來分析了,其所要做的,就是把n-1通過b移到c(當然可以c到b),然後把第n移到b,然後把之前的n個通過a移到b,而其遞迴的插入點,就是從0到n的移動,記住,當移動上面的任何多少層塔時,其下面的任何多少層塔都是可以無視的,總比其上打,且其上的任何多少層塔的移動,都是靠乙個柱子移到另乙個柱子.
其實,總的來說,遞迴演算法可以說是從結果出發的,以發現其規律性.
漢諾塔問題總結
前言今天在看 二叉樹的時候 裡面好多思想都涉及到遞迴,加上我之前一直對遞迴了解的不是很清除,所以打算系統的學一下,這一學不要緊 可把我給整苦了 腦子太笨繞不過來 有一篇部落格說 學遞迴最好最有代表性的演算法問題算是 漢諾塔問題 了 然後就試著了解了一下漢諾塔問題 並留下了 這篇文章作為總結 怕自己忘...
漢諾塔問題
問題 假設有3個分別命名為x,y,z的寶塔,在塔座x上插有n個直徑大小各不相同,從小到大編號為1,2,3。n的圓盤。現要求將x軸上的n個圓盤移至塔座z上 並仍然按同樣的順序疊排,圓盤移動時必須遵循下列規則 1.每次只能移動乙個圓盤 2.圓盤可以插在x,y和z中的任一塔座上 3.任何時刻都不能將乙個較...
漢諾塔問題
問題是 印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。解答結果請自...