Python3之遞迴函式簡單示例

nt1979發表於2021-09-09

概述

遞迴函式即直接或間接呼叫自身的函式,且遞迴過程中必須有一個明確的遞迴結束條件,稱為遞迴出口。遞迴極其強大一點就是能夠遍歷任意的,不可預知的程式的結構,比如遍歷複雜的巢狀列表。

遞迴求和

我們可以利用遞迴函式實現一個Python內建函式sum()的遞迴版。

# 遞迴
def d_sum(L):
    if not L:
        return 0
    else:
        return L[0] + d_sum(L[1:])

sum_l = d_sum(range(10))
print(sum_l)

示例結果

45

該遞迴函式怎麼實現列表元素相加的呢? 我們知道函式是有本地作用域的,對函式呼叫的每一個開啟的時候,在執行時呼叫堆疊上都有自己的一個本地作用域的副本,即L在每個層級都是不同的,比如我們可以透過每次呼叫時新增一個列印語句,更加直觀展示每個層級L的情況

# 遞迴
def d_sum(L):
    # 列印該層級L
    print(L)
    if not L:
        return 0
    else:
        return L[0] + d_sum(L[1:])
# 構建 0-10 數字元素列表
L = [i for i in range(10)]
sum_l = d_sum(L)
print(sum_l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
[4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
[6, 7, 8, 9]
[7, 8, 9]
[8, 9]
[9]
[]
45

處理任意結構

比如我們可以利用遞迴計算一個巢狀的子列表結構中所有數字的總和

def dd_sum(L):
    tot = 0
    for x in L:
        if not isinstance(x, list):
            tot += x
        else:
            tot += dd_sum(x)
    return tot

# 巢狀列表
L = [1,[2,3],[4,[5,6,7],8],9]
sum_l = dd_sum(L)
print(sum_l)

示例結果:

45

這種處理方式看似複雜,我們可能更多會利用迴圈語句替代,但是使用遞迴函式邏輯簡單清晰,這是使用的一大優點。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4822/viewspace-2823042/,如需轉載,請註明出處,否則將追究法律責任。

相關文章