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获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
利用python和百度地图API实现数据地图标注的方法
May 13 Python
python Tkinter的图片刷新实例
Jun 14 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
wxPython绘图模块wxPyPlot实现数据可视化
Nov 19 Python
使用Python进行防病毒免杀解析
Dec 13 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 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访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
Javascript 对象的解释
2008/11/24 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
python查找第k小元素代码分享
2013/12/18 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python向excel中写入数据的方法
2019/05/05 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python实现横向拼接图片
2020/03/23 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
汽车运用工程毕业生自荐信
2013/10/29 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
综合办公室岗位职责
2015/04/11 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
高二化学教学反思
2016/02/22 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python