每日演算法練習 遞迴(Hanoi漢諾塔問題)

2021-08-25 08:13:51 字數 1822 閱讀 4748

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

不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,並且始終保持上小下大的順序。這需要多少次移動呢?這裡需要遞迴的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。n=64時,

假如每秒鐘一次,共需多長時間呢?乙個平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下:

18446744073709551615秒

這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。

只能說很庫!!!

沒圖說個**呀:

上圖為 3 階 hanoi 塔執行示意圖

假設有三個命名為 a b c 的塔座 ,在塔座a上插有n個直徑大小不相同,由小到大編號為1 ,2 ,3 ,··· ,n的圓盤,要求將a座上的圓盤移至塔座c

並按同樣的順序疊排

圓盤移動必須遵守下列規則:

1:每次只能移動乙個圓盤 2:圓盤可以插在任意乙個塔座上 3:任何時刻都不能將乙個較大的圓盤放在乙個較小的圓盤上

若有n個盤子,則移動完所需之次數為2^n - 1,

所以當盤數為64時,則所需次數為:

2^64 - 1 = 18446744073709551615

為5.05390248594782e+16年,也就是約5000世紀,如果對這數字沒什麼概念,就假設每秒鐘搬乙個盤子好了,也要約5850億年左右。

以三階hanoi塔為例,我們所需要的7個步驟是:

1——>c

2——>b

1——>b

3——>c

1——>a

2——>c

1——>c

則對於n階hanoi塔:

n = 1時只需將編號為1的圓盤從a座移至c座

n > 1時,我們分三個階段:

1:將a塔座上的n-1個圓盤按照規定移至到b塔座

2:將編號為n的圓盤由a座移至c座

3:利用a塔座,將b塔座上的n-1個圓盤按規定移至到c塔座

如何將n-1個圓盤由乙個塔座移至到另乙個塔座是乙個和原問題有相同特徵屬性的問題,只是問題的規模小些,我們可以用同樣的方法求解,這就是遞迴思想:

使用同樣的方法解決和原問題有相同特徵屬性的子問題,層層遞進直至到達最簡情況(本題即為n=1)進行遞迴,以解決問題。

#include #include // 遞迴求解hanoi問題

// 把n個盤子從x借助y移動到z

void hanoi(int n,char x,char y,char z)

}int main()

return 0;

}

漢諾塔問題 hanoi(遞迴)

漢諾塔問題 hanoi 現有abc三個柱子,a中有n個盤 上小下大 移動到c上,要求全程上小下大 演算法 遞迴,把1 n 1個盤當作乙個整體 include 函式宣告 函式功能 把n個盤 從a 借助b,移到c hanoi int n,char x,char y,char z 函式功能 把乙個盤子x ...

帶你理解 Hanoi 漢諾塔遞迴演算法

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

深刻的理解遞迴漢諾塔(Hanoi)

演算法 1,從目標出發,我們將n個盤子從a移動到b通過c,假如我們這樣寫 hanoi n,a,b,c 2,同理,我們也就可以知道,將n 1個盤子從a移動到b通過c,即就是 hanoi n 1,a,b,c 3,但是我們知道我們一次只能移動乙個盤子,所以,如果我們要將n個盤子從a移動到b通過c,我們可以...