成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

匪夷所思 Python實現尾遞歸優化

開發 后端
一般來說,Python和Java、C#一樣,是沒有尾遞歸自動優化的能力的,但本文將給大家介紹如何使用Python來實現尾遞歸優化,希望給大家以啟示。

一般來說,Python和Java、C#一樣,是沒有尾遞歸自動優化的能力的,遞歸調用受到調用棧長度的限制被廣泛的詬病,但本文將給大家一個匪夷所思的方法,來實現Python的尾遞歸優化,因此Python的遞歸調用再也不用受到調用棧長度的制約。

51CTO推薦閱讀:使用Python遞歸對文件進行相關處理

先來看尾遞過方式的調用:

  1. defFib(n,b1=1,b2=1,c=3):  
  2. ifn<3: 
  3. return1  
  4. else:  
  5. ifn==c:  
  6. returnb1+b2  
  7. else:  
  8. returnFib(n,b1=b2,b2=b1+b2,cc=c+1) 

這段程序我們來測試一下,調用Fib(1001)結果:

  1. >>>defFib(n,b1=1,b2=1,c=3):  
  2. ...ifn<3: 
  3. ...return1  
  4. ...else:  
  5. ...ifn==c:  
  6. ...returnb1+b2  
  7. ...else:  
  8. ...returnFib(n,b1=b2,b2=b1+b2,cc=c+1)  
  9. ...  
  10. >>>Fib(1001)  
  11.  
  12. 703303677114228158218352548771835497701812698363587327426  
  13. 049050871545371181969335797422494945626117334877504492417  
  14. 659910881863632654502236471060120533741212738673391111981  
  15. 39373125598767690091902245245323403501L 

如果我們用Fib(1002),結果如下:

  1. .....  
  2. File"<stdin>",line8,inFib  
  3. File"<stdin>",line8,inFib  
  4. File"<stdin>",line8,inFib  
  5. File"<stdin>",line8,inFib  
  6. File"<stdin>",line8,inFib  
  7. File"<stdin>",line8,inFib  
  8. RuntimeError:maximumrecursiondepthexceeded 

現在我們來尾遞歸優化。我們給剛才的Fib函數增加一個Decorator,如下:

  1. @tail_call_optimized  
  2. defFib(n,b1=1,b2=1,c=3):  
  3. ifn<3: 
  4. return1  
  5. else:  
  6. ifn==c:  
  7. returnb1+b2  
  8. else:  
  9. returnFib(n,b1=b2,b2=b1+b2,cc=c+1) 

就是這個@tail_call_optimized的裝飾器,這個裝飾器使Python神奇的打破了調用棧的限制。這下即使我們Fib(20000),也能在780ms跑出結果。

  1. importsys  
  2. classTailRecurseException:  
  3. def__init__(self,args,kwargs):  
  4. self.args=args  
  5. self.kwargs=kwargs  
  6. deftail_call_optimized(g):  
  7. """  
  8. Thisfunctiondecoratesafunctionwithtailcall  
  9. optimization.Itdoesthisbythrowinganexception  
  10. ifitisit'sowngrandparent,andcatchingsuch  
  11. exceptionstofakethetailcalloptimization.  
  12.  
  13. Thisfunctionfailsifthedecorated  
  14. functionrecursesinanon-tailcontext.  
  15. """  
  16. deffunc(*args,**kwargs):  
  17. f=sys._getframe()  
  18. iff.f_backandf.f_back.f_backandf.f_back.f_back.f_code==f.f_code:  
  19. raiseTailRecurseException(args,kwargs)  
  20. else:  
  21. while1:  
  22. try:  
  23. returng(*args,**kwargs)  
  24. exceptTailRecurseException,e:  
  25. args=e.args  
  26. kwargs=e.kwargs  
  27. func.__doc__=g.__doc__  
  28. returnfunc 

使用的方法前面已經展示了,作者用了拋出異常然后自己捕獲的方式來打破調用棧的增長,簡直是太匪夷所思了。而且效率問題,和直接尾遞歸Fib相比大概造成了五倍的時間開銷。最后很不可思議的,尾遞歸優化的目的達成了。

原文鏈接:http://www.cnblogs.com/Alexander-Lee/archive/2010/09/16/1827587.html

【編輯推薦】

  1. Python閉包的概念、形式與應用
  2. Python自動單元測試框架的應用詳解
  3. 旁觀者清 Python與Ruby各有千秋
  4. 手把手教您Python多線程應用技巧
  5. 加速程序開發 Python整合C語言模塊
責任編輯:王曉東 來源: 博客園
相關推薦

2018-11-20 14:48:54

2016-11-17 16:01:21

dagger2android

2009-03-21 15:09:32

Nehalem服務器Intel

2020-05-27 07:38:36

尾遞歸優化遞歸函數

2012-09-04 09:55:22

代碼抓狂的代碼開發

2011-06-03 12:38:05

GeekApp

2009-09-17 09:10:53

阿里馬云

2018-01-31 09:25:39

2020-10-10 09:08:51

數據中心

2020-09-30 08:07:46

如何優化尾調用

2009-07-22 07:44:00

Scala尾遞歸

2019-03-26 08:15:45

iOS尾調用Objective-C

2021-03-24 10:00:32

Python遞歸函數Python基礎

2021-03-09 10:12:28

編程技能開發

2021-10-08 09:07:09

算法程序技術

2017-09-14 09:40:32

PythonUbuntu信號機制

2020-11-02 07:12:27

程序員上級領導管理

2023-12-25 09:19:00

AI英偉達研究

2020-01-18 19:28:33

微軟Windows 10瀏覽器

2012-02-22 14:12:08

算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99国内精品久久久久久久 | 91秦先生艺校小琴 | 欧美韩一区二区 | 在线观看国产视频 | 日本成人免费观看 | 久久久精彩视频 | 午夜午夜精品一区二区三区文 | 国产精品久久一区二区三区 | 成人国内精品久久久久一区 | 992tv人人草 久久精品超碰 | 一本一道久久a久久精品蜜桃 | 午夜播放器在线观看 | 色视频www在线播放国产人成 | 日韩欧美在线播放 | 国产精品国产三级国产aⅴ中文 | 九色国产 | 久久久久久国产 | 国产线视频精品免费观看视频 | 欧美日韩高清 | 国产精品视频网 | 一级做a| 麻豆久久久久久久久久 | 国产国语精品 | 高清一区二区三区 | 国产精品一二区 | 亚洲影音先锋 | cao视频| 操皮视频| 欧美久久一级 | 成人中文字幕av | 羞羞视频免费在线观看 | 国产99免费视频 | 久久国产电影 | 男女羞羞视频在线 | 国产成人精品一区二区 | japan25hdxxxx日本 做a的各种视频 | 中文字幕在线免费 | 亚洲一区二区在线视频 | 中文字幕国产一区 | 国产精品久久久久婷婷二区次 | aaa在线观看 |