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控制台英汉汉英电子词典
Apr 23 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
Python的Tkinter点击按钮触发事件的例子
Jul 19 Python
Python 70行代码实现简单算式计算器解析
Aug 30 Python
Python中如何添加自定义模块
Jun 09 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
Python进行特征提取的示例代码
Oct 15 Python
Python基础知识学习之类的继承
May 31 Python
Python自动化之批量处理工作簿和工作表
Jun 03 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 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的无限分类实现想法~
2007/01/02 PHP
php adodb连接mssql解决乱码问题
2009/06/12 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
BootStrap selectpicker
2016/06/20 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
微信小程序实现倒计时功能
2020/11/19 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
使用python实现knn算法
2017/12/20 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
python退出循环的方法
2020/06/18 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
《乞巧》教学反思
2014/02/27 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
护士节慰问信
2015/02/15 职场文书
一文解答什么是MySQL的回表
2022/08/05 MySQL