更多數學趣題:Hanoi塔

===》點我返回目錄《===

印度有個古老傳說:在世界的中心貝拿勒斯的神廟裏,一塊黃銅板上插着三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上穿好了由大到小的64片金片,這就是漢諾塔。不論白天黑夜,一羣沉默的僧侶在移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消失。

 

漢諾塔模型如上圖,問題化成將A中的盤片最後轉移到B中,可以藉助中間一根柱子。

你上來就直接移動幾個盤片,擺弄了幾次,你放棄了,因爲太繁瑣了。碰到這種問題,我們一般是簡化。

最簡化的,是假設只有一個盤片,那太容易了,直接移到B;

次簡化的,假設有兩個盤片,那就把第一個小盤片移到中間的柱子,然後把底下的大盤片移到B,再之後把小盤片從中間移到B。

進一步,假設有三個盤片,步驟一是把第一個小盤片移到B,然後步驟二把第二個盤片移到中間,再之後步驟三把B上的小盤片移到中間,這樣上面的兩個盤片整體移到中間柱子了,所以步驟四就是把A剩下的底下那個大盤片移動到B,步驟五就是把中間柱子最上面的小盤片移動到A,步驟六把中間柱子下面的盤片移動到B,最後步驟七把A的小盤片移動到B。完畢。如下圖所示:

 

我們仔細看上面的步驟,會發現一個關鍵點,就是對三個盤片來講,就是要先想方設法讓上面的兩個整體移動到中間柱子,剩下的大盤片就直接移動到最後的目標了。

推廣這個結論,對N個盤片,我們的任務就變成了先將N-1個盤片整體移動到中間柱子,然後就好辦了,直接移動底下最大的那個。接下來的任務就是同樣的了,不同之處在於少了一個盤片。這樣一步步剩下N-1,然後N-2,...

所以,這個思路,就是遞歸的思路。n個盤片,123三根柱子,我們先把n-1個盤片整體從柱子1移動到柱子2,再把底下的第n個盤片從柱子1移動到柱子3,最後再把n-1個盤片整體從柱子2移到柱子3。程序實現:

def hanoi(n,a,b,c):

    if n == 1:

        print(n,a,c)

        return

    hanoi(n-1,a,c,b)

    print(n,a,c)

    hanoi(n-1,b,a,c)



print(hanoi(3,1,2,3))

解讀一下。一步步跟蹤。

第一層,hanoi(3,1,2,3),執行 hanoi(n-1,a,c,b)語句即 hanoi(2,1,3,2),遞歸進去,進入第二層;

第二層,hanoi(2,1,3,2),執行hanoi(n-1,a,c,b)語句即hanoi(1,1,2,3),遞歸進去,進入第三層;

第三層,hanoi(1,1,2,3),執行print(n,a,c)語句即print(1,1,3),返回到第二層;

繼續第二層,執行print(n,a,c)語句即print(2,1,2),再執行hanoi(n-1,b,a,c)語句即hanoi(1,3,1,2),遞歸進去,再次進入第三層;

第三層,hanoi(1,3,1,2),執行print(n,a,c)語句即print(1,3,2),返回到第二層;

第二層語句都執行完了,返回第一層;

繼續第一層,執行print(n,a,c)語句即print(3,1,3),再執行hanoi(n-1,b,a,c)語句即hanoi(2,2,1,3),遞歸進去,再次進入第二層;

第二層,hanoi(2,2,1,3),執行hanoi(n-1,a,c,b)語句即hanoi(1,2,3,1),遞歸進去,進入第三層;

第三層,hanoi(1,2,3,1),執行print(n,a,c)語句即print(1,2,1),返回到第二層;

繼續第二層,hanoi(2,2,1,3),執行print(n,a,c)語句即執行print(2,2,3),再執行hanoi(n-1,b,a,c)即hanoi(1,1,2,3),遞歸進去,進入第三層;

第三層,hanoi(1,1,2,3),執行print(n,a,c)語句即print(1,1,3),返回到第二層;

第二層語句執行完了,返回第一層;

第一層語句也執行完了,完畢。

最後輸出結果:

1 1 3

2 1 2

1 3 2

3 1 3

1 2 1

2 2 3

1 1 3

上面的調用過程可以用一個圖直觀展示:

 

從這個圖我們可以看到,遞歸的調用過程是一棵樹,逐層展開的逐層返回。我們對遞歸的詳細介紹也到此爲止,後面不這麼一步步跟蹤了。你要熟悉這個過程。

我們計算一下,N片要移動多少次?我們從上面代碼看到了,f(k+1)=2*f(k)+1,不難證明f(n)=2n-1。從調用圖示也可以看出來,第一層有一次,第二層有兩次,第三層有四次。

按照傳說,Hanoi塔上有64個盤片,所以一共要移動的次數爲f(64)= 264-1=18446744073709551615。這是一個難以想象的大數。

如果這些僧侶一秒鐘移動一次,大約要花584554049253.855年也就是說需要5845億年以上,而地球存在不過45億年,太陽系的預期壽命據說也就是數百億年。Hanoi塔搬完的那個時候,我們熟悉的一切,地球,太陽,星空,文明,估計都已經不存在了。

所以傳說當僧侶們搬完這些金片的時候這世界就會消失,或許沒有錯啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章