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绘制数据的瀑布图的教程
Apr 07 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
PyQt5每天必学之切换按钮
Aug 20 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Python实现某论坛自动签到功能
Aug 20 Python
基于django micro搭建网站实现加水印功能
May 22 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
python 实现表情识别
Nov 21 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
python 实现Harris角点检测算法
Dec 11 Python
python爬取新闻门户网站的示例
Apr 25 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中如何在有限的内存中读取大文件
2013/07/02 PHP
php上传文件问题汇总
2015/01/30 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
python 图像平移和旋转的实例
2019/01/10 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
python/golang 删除链表中的元素
2020/09/14 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
大学生简历的个人自我评价
2013/12/04 职场文书
公司业务员岗位职责
2014/03/18 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
Python基础知识学习之类的继承
2021/05/31 Python