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中is和id的用法
Apr 03 Python
Python中用PIL库批量给图片加上序号的教程
May 06 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
Linux CentOS7下安装python3 的方法
Jan 21 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
May 24 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
详解python中的time和datetime的常用方法
Jul 08 Python
Python连接字符串过程详解
Jan 06 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 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详解ASCII码对照表与字符转换
2011/12/05 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
Js动态创建div
2008/09/25 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
Linux下Python获取IP地址的代码
2014/11/30 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
浅析Python多线程下的变量问题
2015/04/28 Python
Python中的choice()方法使用详解
2015/05/15 Python
python安装与使用redis的方法
2016/04/19 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
python构建深度神经网络(DNN)
2018/03/10 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
Servlet面试题库
2015/07/18 面试题
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
雷锋之歌观后感
2015/06/10 职场文书
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers