C語言程式設計遞迴演算法實現漢諾塔

2022-09-24 13:00:11 字數 1783 閱讀 6167

法國數學家愛德華盧卡斯曾編寫過乙個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

這個傳說挺有意思的,這個傳說是說有64片金片。但我們要討論是只有3片或4片金片。看看網圖吧。

我們以三片開始討論。而討論題目開始先明白,這個柱子的位置並不影響移動,只是特定的柱子才是關鍵。

我們來看看如果只有乙個金片,要移動多少次。

很明顯,只要一次就夠了。

再來看看兩片金片。

由於要全移動到c柱

1:a:a->b

2:b:a->c

3;a:b->c

三步就可以全移動過去。

或者想要移動b片要先移動**,將空c柱留給b片,去考慮**的移動。

再來看看三片的移動

再來根據上面的思路,要想移動c片,得先移動a和b兩片,把c柱留給c片。

要先滿足這個條件

且大不能在小上面。要先移成這個樣子。

且,要滿足這個樣子得,先這樣。

總結一下

第一步第二步

第三步這麼看下來,跟先前我們**只移兩片,就沒什麼區別了。

再將c片移動到c柱。

成了這個樣子。再來看看,我文章開頭說的,柱子的位置不是關鍵,位置是可以改變,只是要移動到特定的柱子。現在這樣,像不像,我們先前去移動兩個金片的步驟?

看清楚,這個樣子,就是移動兩個金片的步驟。再按上面的方法步驟,就行了。

我們來計算一下這寫步驟

第一部分:

移動兩個金片到b柱。

第二部分:

移動c片到c柱

第三部分:

在移動兩個金片到c柱。

總結一下

就是移兩個金片的步驟,移兩次,再移一次最下面的金片。總共2*3+1==7次。

再來看看四個金片的步驟。

要想移動這四個金片,必需要將這最下面的金片移動

這樣來看,分兩部分。

一:移動d片到c柱

二:移動a.b.c這仨個金片到c柱。

與上面移三片模擬,、

第 一目的

第 二目的

第三目的

可以分三部完成。可見三片移法要aynhbngue移兩次。

就是2*7+1==15次。

當移動n片金片時,要先考慮,

一–>移動這n-1片金片。

二–>再移第n片,

三–>再移動那n-1片到目的地。

可以分這三步。

柱子的位置對移動並沒有上面影響。

看**,這是計算次數的**。

#include

int hanoi(int n)

int main(void)

這是編譯步驟的**

#include

voiwww.cppcns.comd move(char start,char end,int n)

void hanoi(int n,char pose1,caynhbnguehar pose2,char pose3)

}int main(void)

使用遞迴時,要將其理解成乙個功能模組,而不是一步一步去分析。使用它的功能,同時確定終止條件並接近這個條件。

運用遞迴寫函式,可以」輕鬆「計算。

只為加深自己理解,含有學生氣,勿笑。

如有問題,煩請指點一二。

C 遞迴實現漢諾塔

a為存放盤子的塔,b為目標塔,c為輔助塔 演算法分為三步 一 將a上n 1個盤子全部放到c塔上 二 將a上剩下的乙個盤子放到b塔上 三 將c塔上的盤子全部放到b塔上 注 不需要考慮如何移動n 1個盤子 遞迴過程 首先,將a上n 1個盤子放到c上,然後將a上剩下的乙個盤子放到b上,然後可以看成a為輔助...

C 漢諾塔遞迴實現

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

漢諾塔遞迴的c語言遞迴實現

include include using namespace std void move int n,char from,char rely,char to else int main 漢諾塔遞迴演算法思路如下 三個柱子 起點柱子 from,依賴柱子 rely,目標柱子 to 演算法流程 函式引數...