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 ...