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 # 當(dāng)最后臺階為0的時候,說明最后只是走了一次 if n == 0: count = 1 # 當(dāng)最后臺階不為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機器學(xué)習(xí)NLP自然語言處理基本操作關(guān)鍵詞
本文是Python機器學(xué)習(xí)NLP自然語言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語言處理 (NLP) 的旅程. 本文主要學(xué)習(xí)NLP自然語言處理關(guān)鍵詞的操作2021-09-09利用Django框架中select_related和prefetch_related函數(shù)對數(shù)據(jù)庫查詢優(yōu)化
這篇文章主要介紹了利用Python的Django框架中select_related和prefetch_related函數(shù)對數(shù)據(jù)庫查詢的優(yōu)化的一個實踐例子,展示如何在實際中利用這兩個函數(shù)減少對數(shù)據(jù)庫的查詢次數(shù),需要的朋友可以參考下2015-04-04Python3 中把txt數(shù)據(jù)文件讀入到矩陣中的方法
下面小編就為大家分享一篇Python3 中把txt數(shù)據(jù)文件讀入到矩陣中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04使用python爬取微博數(shù)據(jù)打造一顆“心”
這篇文章主要介紹了使用python基于微博數(shù)據(jù)打造一顆“心”,作為程序員,我準(zhǔn)備了一份特別的禮物,用以往發(fā)的微博數(shù)據(jù)打造一顆“愛心”,我想她一定會感動得哭了吧,需要的朋友可以參考下2019-06-06python腳本設(shè)置系統(tǒng)時間的兩種方法
這篇文章主要介紹了python腳本設(shè)置系統(tǒng)時間的兩種方法,其一是調(diào)用socket直接發(fā)送udp包到國家授時中心,其二是調(diào)用ntplib包,感興趣的小伙伴們可以參考一下2016-02-02Python?OpenCV超詳細講解透視變換的實現(xiàn)
OpenCV用C++語言編寫,它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實時視覺應(yīng)用,并在可用時利用MMX和SSE指令,本篇文章帶你通過OpenCV實現(xiàn)透視變換2022-04-04