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程序设计入门(2)变量类型简介
Jun 16 Python
用Python给文本创立向量空间模型的教程
Apr 23 Python
对python程序内存泄漏调试的记录
Jun 11 Python
Python+OpenCV图片局部区域像素值处理详解
Jan 23 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
Python+threading模块对单个接口进行并发测试
Jun 25 Python
Python 用turtle实现用正方形画圆的例子
Nov 21 Python
python3正则模块re的使用方法详解
Feb 11 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
Python 中Operator模块的使用
Jan 30 Python
python源码剖析之PyObject详解
May 18 Python
Pandas 数据编码的十种方法
Apr 20 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中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
react redux入门示例
2018/04/19 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
python求绝对值的三种方法小结
2019/12/04 Python
美国在线宠物商店:Chewy
2019/01/12 全球购物
PHP面试题大全
2015/10/16 面试题
《自然之道》教学反思
2014/02/11 职场文书
工作迟到检讨书
2014/02/21 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
农业项目投资意向书
2015/05/09 职场文书
上班旷工检讨书
2015/08/15 职场文书
品德与社会教学反思
2016/02/24 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS