漢諾塔問題其實很簡單
首先上程式碼
1 def hanoi_move(n, source, dest, intermediate): 2if n >= 1:# 遞迴出口,只剩一個盤子 3hanoi_move(n-1, source, intermediate, dest) 4print("Move %s -> %s" % (source, dest)) 5hanoi_move(n-1, intermediate, dest, source)
首先我們這裡有三根杆子依次排放,分別是 源杆、媒介杆、目標杆 對應 程式碼的 source、dest、intermediate,源杆上有n塊大餅
我們定義一個函式 def hanoi(n,源杆,目標杆,媒介杆):# 意思是源杆 藉助 媒介杆 到 目標杆
我們假設除了底下最後一層上面的n-1層都已經擺放好了,即源杆上目前只有兩塊大餅,我們要執行的操作是:
源杆上的n-1層 藉助 目標杆 到 媒介杆 等同於 hanoi(n-1,源杆,媒介杆,目標杆)相當於n-1層在媒介杆上了
列印 源杆 到 目標杆 顯示路徑
再把媒介杆的n-1層 藉助 源杆 到 目標杆 等同於 hanoi(n-1,媒介杆,目標杆,源杆)
再來說說為什麼假設n-1層的,因為我們在假設n-1層的時候使用了遞迴,在hanoi(n-1…)的時候我們就是假設n-2層已經擺放好了,然後就是在hanoi(n-2…)的時候我們假設n-3層已經擺放好了,不斷回溯,就到了最上面一層已經擺放好了,這個假設是合理的,既可以使用該方法。使用了遞迴的回溯思想,如果使用遞迴思想不斷地推出他的步驟那基本是不可能的,然而通過前提不斷地假設反而更容易拿到結果。