在閱讀http://www.cnblogs.com/skabyy/p/3451780.html這篇文章的時候,實驗yield的流式迭代素數的時候發現有個問題,故詳細記錄下來。html
首先來看看python默認的最大遞歸層數:python
運行環境:Windows 10,x64
python環境:python3.5編程
def foo(n): print(n) n += 1 foo(n) if __name__ == '__main__': foo(1)
獲得的最大數爲998,之後就是報錯了:RecursionError: maximum recursion depth exceeded while calling a Python object編程語言
那麼python容許的最大遞歸層數是多少呢?咱們實驗下:優化
import sys sys.setrecursionlimit(100000) def foo(n): print(n) n += 1 foo(n) if __name__ == '__main__': foo(1)
獲得的最大數字在3925-3929之間浮動,這個是和計算機有關係的,否則也不會是一個浮動的數字了(數學邏輯講求嚴謹)。人工智能
咱們已經將數字調到足夠大了,已經大於系統堆棧,python已經沒法支撐到太大的遞歸了。spa
對於沒有尾遞歸的編程語言來講,程序運行起來的時候計算機會給當前進程分配棧,每遞歸一次,計算機就會給當前程序調度一部分來使用,當使用過多了,那麼很差意思,我就這麼點了。而後,就沒有而後了,崩了。python不是尾遞歸優化的語言,咱們不該該使用遞歸來替代掉循環,循環存在必然有它巨大的意義。遞歸用於複雜度爲O(log(n))的計算是頗有意義的,用於O(n)就不怎麼好了。code
那麼有什麼好的解決辦法呢?固然是有的,好比python的generator,這個是python的一大神器,請參看:http://www.jianshu.com/p/d36746ad845dhtm
總結:blog
遞歸是一個頗有用的處理方式,簡單到遍歷文件夾、處理XML;複雜到人工智能等。合理使用遞歸能讓咱們的程序具備簡潔和強的可讀性。