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 strip lstrip rstrip使用方法
Sep 06 Python
线程和进程的区别及Python代码实例
Feb 04 Python
详解python中的json的基本使用方法
Dec 21 Python
Python初学时购物车程序练习实例(推荐)
Aug 08 Python
Python Web程序部署到Ubuntu服务器上的方法
Feb 22 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
python基于递归解决背包问题详解
Jul 03 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
Python中的特殊方法以及应用详解
Sep 20 Python
Python日志器使用方法及原理解析
Sep 27 Python
Python打包为exe详细教程
May 18 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中通过curl smtp发送邮件
2012/06/05 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
lib.utf.js
2007/08/21 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
JS前端笔试题分析
2016/12/19 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
python requests post多层字典的方法
2018/12/27 Python
python和c语言的主要区别总结
2019/07/07 Python
在pycharm中实现删除bookmark
2020/02/14 Python
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
中间件分为哪几类
2012/03/14 面试题
企业趣味活动方案
2014/08/21 职场文书
个人授权委托书样本
2014/09/13 职场文书
主持人开场白台词
2015/05/29 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
Windows server 2012搭建FTP服务器
2022/04/29 Servers