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类的多重继承问题深入分析
Nov 09 Python
Python中的类与对象之描述符详解
Mar 27 Python
进一步理解Python中的函数编程
Apr 13 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
python 实现selenium断言和验证的方法
Feb 13 Python
Pyqt5实现英文学习词典
Jun 24 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
python程序文件扩展名知识点详解
Feb 27 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
详解scrapy内置中间件的顺序
Sep 28 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 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
咖啡知识大全
2021/03/03 新手入门
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
python实现图像识别功能
2018/01/29 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
Oracle快照(snapshot)
2015/03/13 面试题
金融学专科生自我鉴定
2014/02/21 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
竞争上岗实施方案
2014/03/21 职场文书
工程索赔意向书
2014/08/30 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
八年级英语教学反思
2016/02/15 职场文书
python实现双链表
2022/05/25 Python