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


Posted in Python onMarch 05, 2019

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上有所增加呢?

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

可以看到我们设置最大递归深度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检测远程udp端口是否打开的方法
Mar 14 Python
基于wxpython实现的windows GUI程序实例
May 30 Python
浅谈Python的异常处理
Jun 19 Python
取numpy数组的某几行某几列方法
Apr 03 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
python numpy数组中的复制知识解析
Feb 03 Python
python有序查找算法 二分法实例解析
Feb 18 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
Python发送邮件实现基础解析
Aug 14 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
python绘制箱型图
Apr 27 Python
Python小进度条显示代码
Mar 05 #Python
Python嵌套式数据结构实例浅析
Mar 05 #Python
Python字典遍历操作实例小结
Mar 05 #Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 #Python
Python之lambda匿名函数及map和filter的用法
Mar 05 #Python
django中ORM模型常用的字段的使用方法
Mar 05 #Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
Mar 05 #Python
You might like
支持oicq头像的留言簿(一)
2006/10/09 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
PHP反射机制用法实例
2014/08/28 PHP
php给图片加文字水印
2015/07/31 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
Javascript之String对象详解
2016/06/08 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
python魔法方法-自定义序列详解
2016/07/21 Python
如何在python中写hive脚本
2019/11/08 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
python 制作简单的音乐播放器
2020/11/25 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
年底个人总结范文
2015/03/10 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python