1. 程式人生 > >漢諾塔問題其實很簡單

漢諾塔問題其實很簡單

推出 class 回溯思想 除了 source 問題 容易 假設 為我

首先上代碼

1 def hanoi_move(n, source, dest, intermediate):
2     if n >= 1:  # 遞歸出口,只剩一個盤子
3         hanoi_move(n-1, source, intermediate, dest)
4         print("Move %s -> %s" % (source, dest))
5         hanoi_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層已經擺放好了,不斷回溯,就到了最上面一層已經擺放好了,這個假設是合理的,既可以使用該方法。使用了遞歸的回溯思想,如果使用遞歸思想不斷地推出他的步驟那基本是不可能的,然而通過前提不斷地假設反而更容易拿到結果。

漢諾塔問題其實很簡單