python利用高階函數(shù)實現(xiàn)剪枝函數(shù)
本文為大家分享了python利用高階函數(shù)實現(xiàn)剪枝函數(shù)的具體代碼,供大家參考,具體內(nèi)容如下
案例:
某些時候,我們想要為多個函數(shù),添加某種功能,比如計時統(tǒng)計,記錄日志,緩存運算結(jié)果等等
需求:
在每個函數(shù)中不需要添加完全相同的代碼
如何解決?
把相同的代碼抽調(diào)出來,定義成裝飾器
求斐波那契數(shù)列(黃金分割數(shù)列),從數(shù)列的第3項開始,每一項都等于前兩項之和
求一個共有10個臺階的樓梯,從下走到上面,一次只能邁出1~3個臺階,并且不能后退,有多少中方法?
上臺階問題邏輯整理:
每次邁出都是 1~3 個臺階,剩下就是 7~9 個臺階
如果邁出1個臺階,需要求出后面9個臺階的走法
如果邁出2個臺階,需要求出后面8個臺階的走法
如果邁出3個臺階,需要求出后面7個臺階的走法
此3種方式走法,通過遞歸方式實現(xiàn),遞歸像樹,每次遞歸都生成子節(jié)點函數(shù)
以上兩個問題通過遞歸來解決,就會出現(xiàn)一個問題,出現(xiàn)重復(fù)求解問題,把重復(fù)求解的過程剔除掉,在c++語言中稱為剪枝函數(shù)
#!/usr/bin/python3
def jian_zhi(func):
# 中間字典,判斷已經(jīng)是否求解過
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)
# 返回每次遞歸的計數(shù)
return count
if __name__ == '__main__':
print(climb(10, (1, 2, 3)))
print(fibonacci(20))
所謂的剪枝函數(shù)不過是保證每次遞歸的函數(shù)唯一性,利用中間字典保存已經(jīng)執(zhí)行過得函數(shù)和參數(shù),通過判斷參數(shù),剔除重復(fù)的函數(shù)調(diào)用
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python從Excel讀取數(shù)據(jù)并使用Matplotlib繪制成二維圖像
本課程實現(xiàn)使用 Python 從 Excel 讀取數(shù)據(jù),并使用 Matplotlib 繪制成二維圖像。這一過程中,將通過一系列操作來美化圖像,最終得到一個可以出版級別的圖像。本課程對于需要書寫實驗報告,學(xué)位論文,發(fā)表文章,做報告的學(xué)員具有較大價值2023-02-02
詳解Pytorch 使用Pytorch擬合多項式(多項式回歸)
這篇文章主要介紹了詳解Pytorch 使用Pytorch擬合多項式(多項式回歸),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
python flask web服務(wù)實現(xiàn)更換默認端口和IP的方法
今天小編就為大家分享一篇python flask web服務(wù)實現(xiàn)更換默認端口和IP的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python爬蟲包BeautifulSoup學(xué)習(xí)實例(五)
這篇文章主要為大家詳細介紹了Python爬蟲包BeautifulSoup的學(xué)習(xí)實例,具有一定的參考價值,感興趣的朋友可以參考一下2018-06-06

