關於python的最大遞歸層數詳解

在閱讀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;複雜到人工智能等。合理使用遞歸能讓咱們的程序具備簡潔和強的可讀性。

相關文章
相關標籤/搜索