Python 用裝飾器實現遞迴剪枝

2022-05-17 05:31:57 字數 1292 閱讀 9777

求乙個共有10個台階的樓梯,從下走到上面,一次只能邁出1~3個台階,並且不能後退,有多少中方法?

每次邁出都是 1~3 個台階,剩下就是 7~9 個台階

如果邁出1個台階,需要求出後面9個台階的走法

如果邁出2個台階,需要求出後面8個台階的走法

如果邁出3個台階,需要求出後面7個台階的走法

此3種方式走法,通過遞迴方式實現,遞迴像樹,每次遞迴都生成子節點函式

以上兩個問題通過遞迴來解決,就會出現乙個問題,出現重複求解問題,把重複求解的過程剔除掉,在c++語言中稱為剪枝函式

#!/usr/bin/python3

def jian_zhi(func):

# 中間字典,判斷已經是否求解過

median = {}

def wrap(*args):

# 假如不在中間字典中,說明沒有求解過,新增到字典中去,在的話,直接返回

if args not in median:

median[args] = func(*args)

return median[args]

return wrap

@jian_zhi

def fibonacci(n):

if n <= 1:

return 1

return fibonacci(n-1) + fibonacci(n-2)

@jian_zhi

def climb(n, steps):

count = 0

# 當最後台階為0的時候,說明最後只是走了一次

if n == 0:

count = 1

# 當最後台階不為0的時候,說明還需要走至少一次

elif n > 0:

# 對三種情況進行分別處理momo

for step in steps:

count += climb(n-step, steps)

# 返回每次遞迴的計數

return count

if __name__ == '__main__':

print(climb(10, (1, 2, 3)))

print(fibonacci(20))

經驗:

1. 剪紙函式聯合字典的特性,key值唯一,做去重操作

2. 遞迴不過是重複呼叫自己,縮小條件,直到條件滿足的通過 return返回根結果,也就是說return的時候必有確定的結果,然後一路往上返回資料

3. 裝飾器每次在函式呼叫的時候其實本質上呼叫裝飾器中wrap函式,移花接木的魔法而已

python用類實現裝飾器

利用 call 方法,裝飾器的執行流程 當新增裝飾器語法糖時,會把語法糖的變數名加 執行,並將被裝飾的函式名傳入。所以當類加 執行時,執行了 init 產生的物件就是被裝飾的函式,而物件 執行時觸發 call call方法下就能新增一些新的功能了 import time class timeit d...

用裝飾器實現登入

login status jingdong false login status weixin false defstart list list1 for i in list print i,list i select num input 請輸入訪問網頁的編號 退出 q if select num ...

python用裝飾器實現快取函式執行結果

根據呼叫的函式名和呼叫的引數,對函式的結果進行快取,下次執行的時候就不用重複計算 可以用裝飾器來實現 import time import hashlib import pickle cache defis obsolete entry,duration d time.time entry time...