python利用高階函數實現剪枝函數
本文為大家分享了python利用高階函數實現剪枝函數的具體代碼,供大家參考,具體內容如下
案例:
某些時候,我們想要為多個函數,添加某種功能,比如計時統(tǒng)計,記錄日志,緩存運算結果等等
需求:
在每個函數中不需要添加完全相同的代碼
如何解決?
把相同的代碼抽調出來,定義成裝飾器
求斐波那契數列(黃金分割數列),從數列的第3項開始,每一項都等于前兩項之和
求一個共有10個臺階的樓梯,從下走到上面,一次只能邁出1~3個臺階,并且不能后退,有多少中方法?
上臺階問題邏輯整理:
每次邁出都是 1~3 個臺階,剩下就是 7~9 個臺階
如果邁出1個臺階,需要求出后面9個臺階的走法
如果邁出2個臺階,需要求出后面8個臺階的走法
如果邁出3個臺階,需要求出后面7個臺階的走法
此3種方式走法,通過遞歸方式實現,遞歸像樹,每次遞歸都生成子節(jié)點函數
以上兩個問題通過遞歸來解決,就會出現一個問題,出現重復求解問題,把重復求解的過程剔除掉,在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))
所謂的剪枝函數不過是保證每次遞歸的函數唯一性,利用中間字典保存已經執(zhí)行過得函數和參數,通過判斷參數,剔除重復的函數調用
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
利用Django框架中select_related和prefetch_related函數對數據庫查詢優(yōu)化
這篇文章主要介紹了利用Python的Django框架中select_related和prefetch_related函數對數據庫查詢的優(yōu)化的一個實踐例子,展示如何在實際中利用這兩個函數減少對數據庫的查詢次數,需要的朋友可以參考下2015-04-04