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中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python中获取对象信息的方法
Apr 27 Python
python实现指定字符串补全空格的方法
Apr 30 Python
打包发布Python模块的方法详解
Sep 18 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
Python线程下使用锁的技巧分享
Sep 13 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
python百行代码实现汉服圈图片爬取
Nov 23 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php ci框架验证码实例分析
2013/06/26 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
javascript中innerText和innerHTML属性用法实例分析
2015/05/13 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
python监控键盘输入实例代码
2018/02/09 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
python实现扫描ip地址的小程序
2019/04/16 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
客服文员岗位职责
2013/11/29 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android