python遞歸詳解+漢諾塔小案例


 
        

遞歸

    什么是遞歸

遞歸式方法可以被用於解決很多的計算機科學問題,因此它是計算機科學中十分重要的一個概念。

絕大多數編程語言支持函數的自調用,在這些語言中函數可以通過調用自身來進行遞歸。
計算理論可以證明遞歸的作用可以完全取代循環,因此在很多函數編程語言(如Scheme)中習慣用遞歸來實現循環。


遞歸的強大之處在於它允許用戶用有限的語句描述無限的對象。
因此,在計算機科學中,遞歸可以被用來描述無限步的運算,盡管描述運算的程序是有限的。
下面是對Python遞歸函數的簡單了解:
# 類似與棧的先進后出模式
# 遞歸的兩個必要條件 # 1.要有遞推關系 # 2.要有臨界 def digui(num): print('$'+str(num)) # 臨界值 if num >0: # 這里用的是調用本身的函數(遞推關系) digui(num-1) else: print('='*20) print(num) digui(3)
輸出結果為:
$3
$2
$1
$0
====================
0
1
2
3

漢諾塔

什么是漢諾塔?

漢諾塔算法介紹

其實算法非常簡單,當盤子的個數為n時,移動的次數應等於2^n – 1(有興趣的可以自己證明試試看)。后來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 A B C;
若n為奇數,按順時針方向依次擺放 A C B。
⑴按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子A,則把它移動到B;若圓盤1在柱子B,則把它移動到C;若圓盤1在柱子C,則把它移動到A。
⑵接着,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤。這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。
⑶反復進行⑴⑵操作,最后就能按規定完成漢諾塔的移動。
所以結果非常簡單,就是按照移動規則向一個方向移動金片:
如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C
#----------------漢諾塔-----------------#
# 如果有n個圓盤,所需移動的步數為 2^n-1
i = 0
# 定義一個函數給4個參數n是圓盤的個數,a代表A柱子,b,c 函數里面的是形式參數
def move(n,a,b,c):
    # 把變量i全局化,如果不全局化,只可訪問讀取不能進行操作修改
    global i
    if n==1:
        i += 1
        print('移動第',i,'',a,'-->',c)
    else:
        # 1.把A柱上n-1個圓盤移動到B柱上
        move(n-1,a,c,b) # 傳的才是實際參數
        # 2.把A柱上最大的移動到C柱子上
        move(1,a,b,c)
        # 3.把B柱子上n-1個圓盤移動到C柱子上
        move(n-1,b,a,c)

        
move(4,'A','B','C')

輸出結果為:

移動第 1 次 A --> B
移動第 2 次 A --> C
移動第 3 次 B --> C
移動第 4 次 A --> B
移動第 5 次 C --> A
移動第 6 次 C --> B
移動第 7 次 A --> B
移動第 8 次 A --> C
移動第 9 次 B --> C
移動第 10 次 B --> A
移動第 11 次 C --> A
移動第 12 次 B --> C
移動第 13 次 A --> B
移動第 14 次 A --> C
移動第 15 次 B --> C


免責聲明!

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



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