关于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;复杂到人工智能等。合理使用递归能让咱们的程序具备简洁和强的可读性。

相关文章
相关标签/搜索