漢諾塔的演算法,漢諾塔的演算法

2022-01-09 03:40:10 字數 2832 閱讀 4057

1樓:賦予你我的眼

演算法介紹:當盤子的個數為n時,移動的次數應等於2^n–1。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。

首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子a上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放a、b、c;

若n為奇數,按順時針方向依次擺放a、c、b。

所以結果非常簡單,就是按照移動規則向乙個方向移動金片:如3階漢諾塔的移動:a→c,a→b,c→b,a→c,b→a,b→c,a→c

漢諾塔問題也是程式設計中的經典遞迴問題。

擴充套件資料

由來:法國數學家愛德華·盧卡斯曾編寫過乙個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。

印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的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億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。

2樓:鎖映僪鶴騫

純手打,自己理解的。看的東就給分吧...

例如n=3

3,a,b,c

move(a,c)

**********==>a->c

2,b,a,c------------------>}

3樓:笪波悉瀚彭

#include

void

hanoi(int

n,char

a,char

b,char

c)else

}main()

4樓:咴忻

5樓:鬱宜似瀅瀅

用遞迴實現:

#include

void

towers(int

n,char

frompeg,

char

auxpeg,

char

topeg)

//把n-1個盤子從frompeg借助topeg移動到auxpegtowers(n-1,

frompeg,

topeg,

auxpeg);

//把盤子n由frompeg直接移動到topegcout

<<"move

disk

"<

peg"

<

<<"to

peg"

<

<

//把n-1個盤子從auxpeg借助frompeg移動到topegtowers(n-1,

auxpeg,

frompeg,

topeg);

}int

main()

6樓:

#include

void move(char ch1, char ch2)

7樓:新兵蛋子

用不了這麼複雜

,設a上有n個盤子。

如果n=1,則將圓盤從a直接移動到c。

如果n=2,則:

1.將a上的n-1(等於1)個圓盤移到b上;

2.再將a上的乙個圓盤移到c上;

3.最後將b上的n-1(等於1)個圓盤移到c上。

如果n=3,則:

a. 將a上的n-1(等於2,令其為n`)個圓盤移到b(借助於c),步驟如下:

(1)將a上的n`-1(等於1)個圓盤移到c上。

(2)將a上的乙個圓盤移到b。

(3)將c上的n`-1(等於1)個圓盤移到b。

b. 將a上的乙個圓盤移到c。

c. 將b上的n-1(等於2,令其為n`)個圓盤移到c(借助a),步驟如下:

(1)將b上的n`-1(等於1)個圓盤移到a。

(2)將b上的乙個盤子移到c。

(3)將a上的n`-1(等於1)個圓盤移到c。

到此,完成了三個圓盤的移動過程。

從上面分析可以看出,當n大於等於2時,移動的過程可分解為三個步驟:

第一步 把a上的n-1個圓盤移到b上;

第二步 把a上的乙個圓盤移到c上;

第三步 把b上的n-1個圓盤移到c上;其中第一步和第三步是類同的。

當n=3時,第一步和第三步又分解為類同的三步,即把n`-1個圓盤從乙個針移到另乙個針上,這裡的n`=n-1。 顯然這是乙個遞迴過程,據此演算法可程式設計如下:

move(int n,int x,int y,int z)}main()

求漢諾塔的c語言演算法步驟當m3時程序是怎么算

這是遞迴呼叫 h 3 呼叫h 2 m h 2 每乙個h 2 又呼叫h 1 m h 1 c語言 漢諾塔程式執行步驟 這個問題你要先把遞迴搞懂才能理解的,最好是單跟蹤執行一下,我這裡就簡單說一下吧 hanoi 5,a b c 把5個從 a 移到 c 這時n 5,noe a two b three c 因...

5層漢諾塔遊戲31步怎麼移到另柱子上

5層漢諾塔遊戲弄好四層後,先把上面的四個借助第三根柱子移到第二根柱子上,再把剩下的乙個移到第三根柱子上,最後借助第一根柱子將第二根柱子上的移到第三根柱子上去。漢諾塔,又稱河內塔,是一款wp7平台上源於印度乙個古老傳說的益智類遊戲。漢諾塔 傳說上帝創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上...

用少於解釋埃及金字塔 印度的種姓制度 《漢謨拉比法典》

埃及金字塔,建於4500年前埃及古王朝時期,是古埃及法老和王后的陵墓。陵墓是用巨大石塊修砌成的方錐形建築,形似漢字 金 字,故譯作 金字塔 埃及迄今已發現大大小小的金字塔110座。種姓制度,以婆羅門為中心,劃分出許多以職業為基礎的內婚制群體 種姓 並且依次劃分成許多次種姓 聚落種姓,層層相扣,整合成...