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进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
Python中的getopt函数使用详解
Jul 28 Python
python机器学习之神经网络(二)
Dec 20 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
简单了解python的内存管理机制
Jul 08 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Django之模板层的实现代码
Sep 09 Python
python如何查看安装了的模块
Jun 23 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 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下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
js获取div高度的代码
2008/08/09 Javascript
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
windows 下python+numpy安装实用教程
2017/12/23 Python
python路径的写法及目录的获取方式
2019/12/26 Python
python实现自动打卡的示例代码
2020/10/10 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
python re模块和正则表达式
2021/03/24 Python
高校自主招生自荐信
2013/12/09 职场文书
单身联谊活动方案
2014/01/29 职场文书
教师三严三实心得体会
2014/10/11 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js