漢諾塔(河內塔)

2021-06-27 16:58:16 字數 2466 閱讀 9156

2023年,一位法國的數學家edouard lucas 教授在歐洲的乙份雜誌上介紹了乙個相當吸引人的難題──迷人的智力遊戲。

這個遊戲名為河內塔(tower of hanoi),它源自古印度神廟中的一段故事(也有一說是lucas 教授為增加此遊戲之神秘色彩而捏造的)。

傳說在古老的印度,有一座神廟,據說它是宇宙的中心。

在廟宇中放置了一塊上面插有三根長木釘的木板,在其中的一根木釘上,從上至下被放置了64片直徑由小至大的圓環形金屬片。

古印度教的天神指示祂的僧侶們將64片的金屬片移至三根木釘中的其中一根上。

規定在每次的移動中,只能搬移一片金屬片,並且在過程中必須保持金屬片由上至下是直徑由小至大的次序,也就是說不論在那一根木釘上,圓環形的金屬片都是直徑較小的被放在上層。

直到有一天,僧侶們能將64片的金屬片依規則從指定的木釘上全部移動至另一根木釘上,那麼,世界末日即隨之來到,世間的一切終將被毀滅,萬物都將至極樂世界。

倘若這個故事的敘述為真,那麼,我們只需加速移動金屬片,是不是就能愈早到達極樂世界呢? 果真要移動這64片金屬片,那麼,至少要花幾次的搬動才能完成呢? 有沒有規律可循呢?

對於河內塔遊戲也可以經由數學上的方法得到一些漂亮的結果:若一開始就考慮64片金屬片似乎太難了,我們不妨把金屬片的數量降低至2片,看看會有什麼結果?

如果只有1片,顯然只須移動一次即可。 當2片直徑不一的金屬片放在同一木釘上,必須將最上的那一片先移至非指定的木釘上,然後將第二片金屬片移至指定的木釘上,再接著將第一片金屬片移至第二片之上,所以,至少要花3次搬移來完成。 若是3片金屬片,依相同的討論方法,可得知須至少移動金屬片7次,如圖1。

圖 1那當n很大時(金屬片數= n ),至少要花幾次呢?

現在假設至少須t(n) 次的移動來完成,那麼,我們再加一片金屬片,即此時共有n+1 片金屬片;我們知道前n 片花了t(n) 次來移動至另一根木釘上,第n+1 片金屬片只須花一次就可移至指定的木釘上,所以,只須再花t(n) 次的移動將n 片金屬片移至這一片金屬片之上,這就完成了任務──有n+1 片金屬片移到另一根木釘上。 它們都是在規範內被完成移動,所以最少移動次數有如下迭代公式:

t(n+1) = 2t(n) + 1

又已知由迭代公式知道:

t(n+1) = 2t(n) + 1

t(n+1)+ 1 = 2t(n) + 2

t(n+1) + 1 = 2(t(n) + 1)

因此構造出以公比為2的等比數列,不難計算知道知道的公式為:

所以我們可以計算出:

好了,河內塔的數學推導暫時到這裡了,現在我們看看它何如在三個柱子之間移動的。

若將三根木釘排成乙個三角形(即木釘在三角形的頂點)如圖2。

假設,移動金屬片的方式被分為順時針方向及逆時針方向,每做一次順時針方向移動,我們在紙上劃上﹨,做一次逆時針方向則劃上∕,若令出發點為a 柱,終點為c 柱。

逐步記錄結果:

圖 2三片金屬片移動的路徑:

其實演算法非常簡單,當盤子的個數為n時,移動的次數應等於2^n – 1(有興趣的可以自己證明試試看)。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子a上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 a b c;

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

⑴按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子a,則把它移動到b;若圓盤1在柱子b,則把它移動到c;若圓盤1在柱子c,則把它移動到a。

⑵接著,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤。這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。

⑶反覆進行⑴⑵操作,最後就能按規定完成漢諾塔的移動。

所以結果非常簡單,就是按照移動規則向乙個方向移動金片:

如3階漢諾塔的移動:a→c,a→b,c→b,a→c,b→a,b→c,a→c

現在我給出我自己寫的c語言**:

#include //a樁為初始位置,b為臨時位置,c為目的位置,n為現在a樁上盤子的數目 

void hanoi_towers(char a, char b, char c, int n) }

int main()

漢諾塔 河內塔 問題 遞迴

description 漢諾塔 又稱河內塔 問題是印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒a b和c,a上面套著 n 個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從a棒搬到c棒上,規定可利用中間的一根b棒作為幫助,但每次只能...

河內之塔 漢諾塔問題 遞迴

河內之塔 towersofhanoi 是法國人m.claus lucas 於1883年從泰國帶至法國的,河內為越戰時 北越的首都,即現在的胡志明市 1883年法國數學家edouardlucas曾提及這個故事,據說創世紀時benares有一座波羅教塔,是由三支鑽石棒 pag 所支撐,開始時神在第一根棒...

python 漢諾塔 Python漢諾塔

import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...