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写的一个文本编辑器
Jan 23 Python
Python爬虫框架Scrapy安装使用步骤
Apr 01 Python
Python实现的多线程端口扫描工具分享
Jan 21 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
Python文件和流(实例讲解)
Sep 12 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
python实现二维数组的对角线遍历
Mar 02 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 Python
Scrapy爬虫文件批量运行的实现
Sep 30 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
漂亮但不安全的CTB
2006/10/09 PHP
PHP计数器的实现代码
2013/06/08 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
js html实现计算器功能
2018/11/13 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Python如何调用外部系统命令
2019/08/07 Python
python 操作hive pyhs2方式
2019/12/21 Python
python多线程使用方法实例详解
2019/12/30 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
python 常见的排序算法实现汇总
2020/08/21 Python
浅析python 字典嵌套
2020/09/29 Python
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
优秀员工表扬信
2014/01/17 职场文书
酒后驾驶检讨书
2014/01/27 职场文书
会计求职信范文
2014/05/24 职场文书
英文版辞职信
2015/02/28 职场文书
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers