Python_算法實現_(1)遞歸漢諾塔

1.遞歸

遞歸(英語:Recursion),又譯爲遞迴,在數學與計算機科學中,是指在函數的定義中使用函數自身的方法。遞歸一詞還較常用於描述以自相似方法重複事物的過程。例如,當兩面鏡子相互之間近似平行時,鏡中嵌套的圖像是以無限遞歸的形式出現的。也可以理解爲自我複製的過程。

一般來說,遞歸由兩部分組成遞歸步驟和終止條件,以階乘爲例進行介紹。

def factorial(n):
    if n==1:
        return 1
    else:
        return n*factorial(n-1)


result = factorial(5)
print(result)

在階乘的遞歸代碼中,當n=1時,返回1是種植條件,n!=1的部分爲遞歸步驟。遞歸的關鍵就在於尋找遞歸的終止條件和遞歸步驟。

2.漢諾塔

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

試想一下,如果我們要將最大的圓盤移動到最右邊的柱子上。我們需要把除此圓盤的其他圓盤先移動到中間的柱子上。因此這個問題就變成了如何將 N-1 個圓盤移動到中間的柱子上。很容易我們就想到了遞歸的方法。

將 N 個圓盤從左邊柱子移動到右邊柱子:

  • [遞歸的]將 N-1 個圓盤從左邊柱子移動到中間柱子。
  • 將最大的圓盤從左邊柱子移動到右邊柱子。
  • [遞歸的]將 N-1 個圓盤從中間柱子移動到右邊柱子。
def hanoiTower(height, left='left', right='right', middle='middle'):
    # 四個參數表示現有移動數量 起始位置 目標位置 藉助位置
    if height:
        # 如果需要移動  把n-1個從左藉助右移動到中間
        hanoiTower(height - 1, left, middle, right)

        # 把最下面一個從左移動到右
        print(left, '=>', right)

        # 把剩下的n-1個從中間藉助左移動到右
        hanoiTower(height - 1, middle, right, left)

hanoiTower(3)

漢諾塔是很經典的遞歸問,也可以用其他語言進行書寫,對遞歸會有更深刻的認識。

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