11.24 64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法

漢諾塔是一個非常經典的數學模型,它有一個古老的傳說。相傳印度主神大梵天在創造世界的同時,也造了三根金剛石柱子。

其中一根柱子上放著64個大小均不相同的圓盤。大梵天命令婆羅門將這64個圓盤按照從大到小的順序移動到另一根柱子上,在移動的過程中始終要保持大盤在下,小盤子在上。這就是最早關於漢諾塔的古老傳說。這其實是一種時間的象徵,因為按照這個規則,將64個圓盤移動到另一個圓柱上,在時間上來說幾乎是不可能的,需要的時間可能比宇宙誕生的時間還要長,具體為什麼?文章會為大家詳細說明。

64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法

我們首先將這個遊戲簡化。

我們設定有A、B、C三根柱子,A柱子上從下往上放的是從大到小依次排好順序的盤子,B和C柱子是空的。我們需要將A柱子上所有的圓盤移動到C柱子上,移動的過程中,始終保持大盤子在下,下盤子在上,這就是漢諾塔的遊戲規則。

64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法

先從最基礎的說起。

  • 一個圓盤子:如果只有一個圓盤子,那隻需要移動一次,直接移動到C柱子上。
64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法

  • 兩個圓盤子
    :如果有兩個圓盤子,我們需要藉助B柱子,將第一個盤子移動到B柱子上,第二個盤子移動到C柱子上,然後將B柱子上的盤子移動到C柱子上。這樣兩個盤子就全部移動過來,總共需要3步。
64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法

  • 三個圓盤子:我們給圓盤子依次編號為1、2、3。從規則判斷,首先,我們需要將3移動到C柱子的最底部,所以,我們需要將2和1移動到B柱子上。根據前面講過,我們需要3步就可以了,然後移動3到C。最後重複之前的步驟,將2和1移動到C上。完整的步驟就是1—C,2—B,1—B,3—C,1—A2—C,1—C,總共需要7步完成。
64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法

通過1、2、3階漢諾塔移動步驟,我們可以推倒出一個公式:

 完成步驟=2^n-1,n代表盤子的個數

通過公式我們可以推倒出,四階漢諾塔需要15步驟,五階漢諾塔需要31步驟,而64階漢諾塔需要多少步驟呢?2的64次方減1(18446744073709500000),需要這麼多步驟。假設一個步驟需要1秒,我們將結果換算成年的單位:

 2^64-1=18446744073709500000 
1年=360*24*3600=31104000秒

大概需要5800億年。宇宙大爆炸至今才45億年。假設從那時候開始玩,離完成還需要很多很多年,估計玩到人類滅絕還玩不完。

每一個遊戲背後都有一個邏輯算法在裡面。通過漢諾塔我們已經分析出它的算法,現在我們用Java語言實現它的算法。

64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法

我們通過運行方法可以得到1-5階漢諾塔步驟:

  • 一階:路線:A--->C
  • 二階:路線:A--->B A--->C B--->C
  • 三階:路線:A--->C A--->B C--->B A--->C B--->A B--->C A--->C
  • 四階:路線:A--->B A--->C B--->C A--->B C--->A C--->B A--->B A--->C B--->C B--->A C--->A B--->C A--->B A--->C B--->C
  • 五階:路線:A--->C A--->B C--->B A--->C B--->A B--->C A--->C A--->B C--->B C--->A B--->A C--->B A--->C A--->B C--->B A--->C B--->A B--->C A--->C B--->A C--->B C--->A B--->A B--->C A--->C A--->B C--->B A--->C B--->A B--->C A--->C
  • ...

通過代碼我們可以算出任意階的漢諾塔步驟。64階的漢諾塔步驟電腦也可以算出來,但是電腦需要跑很長時間,即使算出來,也沒有條件存儲步驟的數據。

附上一段64階漢諾塔程序運行的視頻

算法的邏輯其實很簡單:當level(代表幾階漢諾塔)=1的時候,從第一個塔移動到第三個塔,這是一種特殊情況。當level>1時候,遞歸移動level-1層漢諾塔,直到leve=1停止遞歸。

這就是漢諾塔的遞歸算法,古人的智慧真的是很強大。

64階漢諾塔完成需要5800億年?手寫一個漢諾塔遞歸算法


分享到:


相關文章: