遞歸算法與漢諾塔

遞歸算法與漢諾塔

遞歸算法(英語:recursion algorithm)在計算機科學中是指一種通過重複將問題分解爲同類的子問題而解決問題的方法。遞歸算法是一種直接或者間接調用自身函數或者方法的算法。

運用遞歸的條件:每一步進行的操作基本相同,並且問題規模逐漸減小。

遞歸的過程

遞歸,顧名思義,其包含了兩個意思:遞 和 歸,這正是遞歸思想的精華所在。遞歸就是有去(遞去)有回(歸來),用遞歸求4!如下圖所示:

 

用遞歸求階乘的python代碼

def fun(n):

    if n == 0 or n == 1:

        return 1

    else:

        return (n * fun(n - 1))

 

num = int(input("請輸入一個數字: "))

a = fun(num)

print(a)

 

經典遞歸問題

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。此問題等價於:

設a,b,c是3個柱子。開始時,在柱子a上有一疊共n個圓盤,這些圓盤自下而上,由大到小地疊在一起。各圓盤從小到大編號爲1,2,…,n,現要求將柱子a上的圓盤移到柱子c上,在移動圓盤時可以藉助b柱子,但應遵守以下移動規則:

規則1:每次只能移動1個圓盤;

規則2:任何時刻都不允許將較大的圓盤壓在較小的圓盤之上;

規則3:在滿足移動規則1和2的前提下,可將圓盤移至a,b,c中任一柱子上。

 

 

目標:把a柱子上的n個盤子移動到c柱子

遞歸的思想就是把這個目標分解成三個子目標

子目標1:將前n-1個盤子從a移動到b上

子目標2:將最底下的最後一個盤子從a移動到c上

子目標3:將b上的n-1個盤子移動到c上

然後每個子目標又是一次獨立的漢諾塔遊戲,也就可以繼續分解目標直到N爲1

 

用遞歸求漢諾塔的python代碼

def hanoi(n, a, b, c):

    if n == 1:

        print(a, '-->', c)

    else:

        hanoi(n - 1, a, c, b)

        hanoi(1    , a, b, c)

        hanoi(n - 1, b, a, c)

# 調用

n = int(input("請輸入漢諾塔的層數並回車:\n"))

hanoi(n, 'A', 'B', 'C')

 

附錄、

Python實現漢諾塔問題的可視化(以動畫的形式展示移動過程)

https://www.cnblogs.com/ReganWhite/p/10595719.html

 

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