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中DJANGO简单测试实例
May 11 Python
python获取一组汉字拼音首字母的方法
Jul 01 Python
python异常和文件处理机制详解
Jul 19 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
Python面向对象之类的封装操作示例
Jun 08 Python
Django后台admin的使用详解
Jul 08 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
一文搞懂python异常处理、模块与包
Jun 26 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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php cli换行示例
2014/04/22 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
python样条插值的实现代码
2018/12/17 Python
Python读取YAML文件过程详解
2019/12/30 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
Python类super()及私有属性原理解析
2020/06/15 Python
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
如何安装ruby on rails
2014/02/09 面试题
中专毕业自我鉴定
2013/10/16 职场文书
财务总监岗位职责
2015/02/03 职场文书
世界红十字日活动总结
2015/02/10 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js