Python中最大递归深度值的探讨

yipeiwu_com5年前Python基础

Python对递归函数设置是有默认值。 可以通过下面命令来查看设置的默认值

>>> import sys
>>> sys.getrecursionlimit()
3000

查看该函数的帮助文件就更清晰了:

>>> help(sys.getrecursionlimit)
Help on built-in function getrecursionlimit in module sys:
getrecursionlimit(...)
 getrecursionlimit()
 Return the current value of the recursion limit, the maximum depth
 of the Python interpreter stack. This limit prevents infinite
 recursion from causing an overflow of the C stack and crashing Python.

从上面的帮助信息可以看到,如果超过这个默认的最大递归深度,就会导致不可预测的错误,比如C栈溢出或其他错误。 下面用斐波那契数列的递归函数来测试下该方法,来看真正可行的最大递归深度.

>>> def fib(n):
...  if n == 1:
...   return 1
...  else:
...   return fib(n-1) + n
>>> fib(2989)
4468555

当执行到默认的3000附近,2989时,上面是可以执行到的。当递归深度到2900时就报错了。

>>> fib(2990)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 5, in fib
 File "<stdin>", line 5, in fib
 File "<stdin>", line 5, in fib
 [Previous line repeated 2985 more times]
 File "<stdin>", line 2, in fib
RecursionError: maximum recursion depth exceeded in comparison
maximum recursion depth exceeded in comparison

也就是最大的实际递归深度就是2989了,是否可以设置这个值大点呢? 可以通过这个方法来设置:

>>> import sys
>>> sys.setrecursionlimit(10000)
>>> sys.getrecursionlimit()
10000

通过setrecursionlimit(10000)后再查看就是10000。再来测试下实际上的递归深度可以到多少,看是否在2989上有所增加呢?

可以看到我们设置最大递归深度10000,实际执行递归深度达到3400,不再报RecursionError错误,但会报关闭程序的提示。通过一个个单独调试,到3213还能显示正常答案。到3214就又报上面的提示了。

>>> fib(3213)
5163291

上面的是Python3.6.5得出的实际最大递归数字:3213。

同样一台计算机,用Python2.7.10,同样设置成默认最大递归深度10000,得出实际最大递归深度是4484

>>> fib(4484)
10055370

所以最终这个数字取决于计算机本身的计算能力和Python的版本,如果超过系统堆栈深度,Python无法支撑也就奔溃了。同样的PC,Python的版本不同,这个值都有差异。有的时候差异还很大。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对【听图阁-专注于Python设计】的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

python模块之StringIO使用示例

StringIO经常被用来作为字符串的缓存,应为StringIO有个好处,他的有些接口和文件操作是一致的,也就是说用同样的代码,可以同时当成文件操作或者StringIO操作。比如: 复制...

Python实现带百分比的进度条

大家在安装程序或下载文件时,通常都能看到进度条,提示你当前任务的进度。其实,在python中实现这个功能很简单,下面是具体代码。在实际应用中,你完全可以根据自己的要求进行修改!比如,示例...

使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)

不过,status中包含了一个mid字段,通过mid,我们实际上是可以通过计算得到url的。 在开始计算之前有必要说明一下,什么是base62编码。它实际上就是十进制和62位进制的互换。...

Python HTTP客户端自定义Cookie实现实例

Python HTTP客户端自定义Cookie实现实例 几乎所有脚本语言都提供了方便的 HTTP 客户端处理的功能,Python 也不例外,使用 urllib 和 urllib2 可以很...

TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片

TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片

本文是Python通过TensorFlow卷积神经网络实现猫狗识别的姊妹篇,是加载上一篇训练好的模型,进行猫狗识别 本文逻辑: 我从网上下载了十几张猫和狗的图片,用于检验我们训练好...