用函式遞迴的方法解決漢諾塔問題

2021-10-16 10:04:08 字數 1569 閱讀 9870

漢諾塔(又稱河內塔)問題是印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。面對龐大的數字(移動圓片的次數)18446744073709551615,看來,眾僧們耗盡畢生精力也不可能完成金片的移動。後來,這個傳說就演變為漢諾塔遊戲。

簡單來說,就是把a柱上的n個圓盤,通過b柱作為輔助全部搬運到c柱上去。在搬運的過程中一次只能搬運乙個圓盤,而且大圓盤不能放到小圓盤上面。

要用遞迴的方法解決這個問題,我們首先要知道何為遞迴。

遞迴就是乙個函式在它的函式體內呼叫它自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。遞迴函式必須有結束條件。

當函式在一直遞推,直到遇到牆後返回,這個牆就是結束條件。

所以遞迴要有兩個要素,結束條件與遞推關係。

我們很容易知道:

當n=1時,我們直接將盤子從a柱移到c柱便解決了問題。

當n=2時,我們可以先把a柱上的第乙個盤子移動到b柱(a柱最上面的盤子編號為1,向下依次遞增),然後將a柱上的第二個盤子移動到c柱,再將b柱上的盤子移動到c柱即可。

但是當n的值為3及以上時問題便變得麻煩起來了。那麼我們能否將後面複雜的問題化簡為前面簡單的兩種情況呢?

答案是肯定的,這也是函式遞迴的目的:將複雜的問題簡單化。

我們只需將盤子個數為n的分為兩類解決即可:

當n=1時,將盤子從a->c即可。

當n>1時,將a柱上的n-1個盤子移動到b柱上,再將a柱上剩下的乙個(也就是第n個)移動到c柱上,然後將b柱上的n-1個移動到,c柱上即可。(記住我們這裡是將n-1個盤子看為乙個整體)

//漢諾塔問題

其中void move(int n, char a, char b, char c)表示你要將n個盤子從a柱上通過b柱移動到c柱上。(通過你傳入的數字即字元來實現相應操作)

程式設計完成後我們可以輸入乙個比較容易檢測的數來看看程式是否正確。

在我看來漢諾塔問題包括大多數能用函式遞迴解決的問題都需要我們有一種能力,那就是將一些東西當作乙個整體來看待。比如漢諾塔問題中我們就要將n-1看作乙個整體,如果不能做到有這種理解能力,那麼將很難理解如何用函式遞迴解決漢諾塔問題。

C 用遞迴解決漢諾塔問題

遞迴確實是乙個不錯的演算法,可以將原來很複雜的問題簡化.這裡要注意的就是要確定乙個出口條件.不然會出現段錯誤,也就是棧溢位.漢諾塔問題這裡不再贅述,而它的出口條件也就是移動乙個盤子,從源位址移動到目的位置.而如果要用遞迴的方法來實現就要將移動的方法簡化,我們先考慮移動n 1個盤子,從源移動到臨時位置...

遞迴解決漢諾塔問題

何為漢諾塔問題 漢諾塔 hanoi tower 又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間...

遞迴解決漢諾塔問題

漢諾塔 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。c語言實...