python利用高階函數(shù)實(shí)現(xiàn)剪枝函數(shù)
本文為大家分享了python利用高階函數(shù)實(shí)現(xiàn)剪枝函數(shù)的具體代碼,供大家參考,具體內(nèi)容如下
案例:
某些時(shí)候,我們想要為多個(gè)函數(shù),添加某種功能,比如計(jì)時(shí)統(tǒng)計(jì),記錄日志,緩存運(yùn)算結(jié)果等等
需求:
在每個(gè)函數(shù)中不需要添加完全相同的代碼
如何解決?
把相同的代碼抽調(diào)出來(lái),定義成裝飾器
求斐波那契數(shù)列(黃金分割數(shù)列),從數(shù)列的第3項(xiàng)開(kāi)始,每一項(xiàng)都等于前兩項(xiàng)之和
求一個(gè)共有10個(gè)臺(tái)階的樓梯,從下走到上面,一次只能邁出1~3個(gè)臺(tái)階,并且不能后退,有多少中方法?
上臺(tái)階問(wèn)題邏輯整理:
每次邁出都是 1~3 個(gè)臺(tái)階,剩下就是 7~9 個(gè)臺(tái)階
如果邁出1個(gè)臺(tái)階,需要求出后面9個(gè)臺(tái)階的走法
如果邁出2個(gè)臺(tái)階,需要求出后面8個(gè)臺(tái)階的走法
如果邁出3個(gè)臺(tái)階,需要求出后面7個(gè)臺(tái)階的走法
此3種方式走法,通過(guò)遞歸方式實(shí)現(xiàn),遞歸像樹(shù),每次遞歸都生成子節(jié)點(diǎn)函數(shù)
以上兩個(gè)問(wèn)題通過(guò)遞歸來(lái)解決,就會(huì)出現(xiàn)一個(gè)問(wèn)題,出現(xiàn)重復(fù)求解問(wèn)題,把重復(fù)求解的過(guò)程剔除掉,在c++語(yǔ)言中稱為剪枝函數(shù)
#!/usr/bin/python3 def jian_zhi(func): # 中間字典,判斷已經(jīng)是否求解過(guò) median = {} def wrap(*args): # 假如不在中間字典中,說(shuō)明沒(méi)有求解過(guò),添加到字典中去,在的話,直接返回 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)最后臺(tái)階為0的時(shí)候,說(shuō)明最后只是走了一次 if n == 0: count = 1 # 當(dāng)最后臺(tái)階不為0的時(shí)候,說(shuō)明還需要走至少一次 elif n > 0: # 對(duì)三種情況進(jìn)行分別處理momo for step in steps: count += climb(n-step, steps) # 返回每次遞歸的計(jì)數(shù) return count if __name__ == '__main__': print(climb(10, (1, 2, 3))) print(fibonacci(20))
所謂的剪枝函數(shù)不過(guò)是保證每次遞歸的函數(shù)唯一性,利用中間字典保存已經(jīng)執(zhí)行過(guò)得函數(shù)和參數(shù),通過(guò)判斷參數(shù),剔除重復(fù)的函數(shù)調(diào)用
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python高階函數(shù)map()和reduce()實(shí)例解析
- 詳解python內(nèi)置常用高階函數(shù)(列出了5個(gè)常用的)
- Python3的高階函數(shù)map,reduce,filter的示例詳解
- 簡(jiǎn)單了解python高階函數(shù)map/reduce
- Python的高階函數(shù)用法實(shí)例分析
- 詳解Python函數(shù)式編程—高階函數(shù)
- python高級(jí)特性和高階函數(shù)及使用詳解
- 詳談Python高階函數(shù)與函數(shù)裝飾器(推薦)
- Python的函數(shù)的一些高階特性
- 詳解Python高階函數(shù)
相關(guān)文章
Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理基本操作關(guān)鍵詞
本文是Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理系列文章,帶大家開(kāi)啟一段學(xué)習(xí)自然語(yǔ)言處理 (NLP) 的旅程. 本文主要學(xué)習(xí)NLP自然語(yǔ)言處理關(guān)鍵詞的操作2021-09-09利用Django框架中select_related和prefetch_related函數(shù)對(duì)數(shù)據(jù)庫(kù)查詢優(yōu)化
這篇文章主要介紹了利用Python的Django框架中select_related和prefetch_related函數(shù)對(duì)數(shù)據(jù)庫(kù)查詢的優(yōu)化的一個(gè)實(shí)踐例子,展示如何在實(shí)際中利用這兩個(gè)函數(shù)減少對(duì)數(shù)據(jù)庫(kù)的查詢次數(shù),需要的朋友可以參考下2015-04-04Python3 中把txt數(shù)據(jù)文件讀入到矩陣中的方法
下面小編就為大家分享一篇Python3 中把txt數(shù)據(jù)文件讀入到矩陣中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04使用python爬取微博數(shù)據(jù)打造一顆“心”
這篇文章主要介紹了使用python基于微博數(shù)據(jù)打造一顆“心”,作為程序員,我準(zhǔn)備了一份特別的禮物,用以往發(fā)的微博數(shù)據(jù)打造一顆“愛(ài)心”,我想她一定會(huì)感動(dòng)得哭了吧,需要的朋友可以參考下2019-06-06python腳本設(shè)置系統(tǒng)時(shí)間的兩種方法
這篇文章主要介紹了python腳本設(shè)置系統(tǒng)時(shí)間的兩種方法,其一是調(diào)用socket直接發(fā)送udp包到國(guó)家授時(shí)中心,其二是調(diào)用ntplib包,感興趣的小伙伴們可以參考一下2016-02-02Python?OpenCV超詳細(xì)講解透視變換的實(shí)現(xiàn)
OpenCV用C++語(yǔ)言編寫(xiě),它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實(shí)時(shí)視覺(jué)應(yīng)用,并在可用時(shí)利用MMX和SSE指令,本篇文章帶你通過(guò)OpenCV實(shí)現(xiàn)透視變換2022-04-04我用Python抓取了7000 多本電子書(shū)案例詳解
這篇文章主要介紹了我用Python抓取了7000 多本電子書(shū)案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03