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使用BeautifulSoup分析网页信息的方法
Apr 04 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
对python中的for循环和range内置函数详解
Apr 17 Python
python使用Matplotlib画饼图
Sep 25 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
python中class的定义及使用教程
Sep 18 Python
django 实现简单的插入视频
Apr 07 Python
Python创建临时文件和文件夹
Aug 05 Python
Python的logging模块基本用法
Dec 24 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
python使用shell脚本创建kafka连接器
Apr 29 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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
第五章 php数组操作
2011/12/30 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
Python将图片转换为字符画的方法
2020/06/16 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
入股协议书范本
2014/11/01 职场文书
社区母亲节活动总结
2015/02/10 职场文书
病假证明模板
2015/06/19 职场文书
老舍《猫》教学反思
2016/02/17 职场文书
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫