漢諾塔解法解析


漢諾塔:

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

簡單描述:將 A 上 N 個盤子經過 B 移動到 C。

  1. 首先考慮最簡單的情況,A 柱上只有一個圓盤,這時候只需要將該圓盤從 A --> C 即可。
  2. 然后考慮 A 柱上有兩個圓盤, 這時候需要將第一個圓盤 A --> B ,然后將第二個圓盤 A --> C ,最后 B --> C,就完成了移動。
  3. 關鍵一步,謹記遞歸的思想是不考慮細節。
  4. 現在有 N 個圓盤,我們需要將其分為兩部分,第 N 個圓盤和第 N-1 以上的圓盤,比如現在 N=4,那么就將圓盤分為 [4, (3,2,1)] 兩部分,按照第二步中的想法,我們的思想是 (3,2,1) 移動到 B,然后將 4 移動到 C,最后將(3,2,1) 移動到 C 完成。
  5. 現在的問題是 (3,2,1) 並不是一個圓盤,我們要將 (3,2,1) 移動到 B,就可以將此抽象為另一個漢諾塔問題,將 A 上 N-1 個盤子經過 C 移動到 B。

解法:

所有的遞歸問題都由兩部分組成: 基礎情況 和 遞歸情況

  • 基礎情況簡單來說就是該遞歸函數的終點。漢諾塔的基礎情況就是 A 上只有一個圓盤時,將 A 移動到 C
  • 遞歸情況就是該遞歸函數繼續遞歸的條件。遞歸情況就是 A 上有不止一個圓盤,需要把該(些)圓盤經過 C 移動到 B

代碼:


# 將 N 個圓盤從 A 經過 BUFFER 移動到 C
def hano(n, A, buffer, C):
    # 基礎情況
    if n == 1:
        print('%s --> %s'%(A,C))
    # 遞歸情況
    else:
        # 將前 n-1 個圓盤從 A 經過 C 移動到 buffer
        hano(n-1, A, C, buffer)
        # 將第 n 個圓盤從 A 移動到 C
        hano(1, A, buffer, C)
        # 將前 n-1 個圓盤從 B 經過 A 移動到 C
        hano(n-1, buffer, A, C)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM