Python中最大递归深度值的探讨

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上有所增加呢?

可以看到我们设置最大递归深度10000,实际执行递归深度达到3400,不再报RecursionError错误,但会报关闭程序的提示。通过一个个单独调试,到3213还能显示正常答案。到3214就又报上面的提示了。

>>> fib(3213)
5163291

上面的是Python3.6.5得出的实际最大递归数字:3213。

同样一台计算机,用Python2.7.10,同样设置成默认最大递归深度10000,得出实际最大递归深度是4484

>>> fib(4484)
10055370

所以最终这个数字取决于计算机本身的计算能力和Python的版本,如果超过系统堆栈深度,Python无法支撑也就奔溃了。同样的PC,Python的版本不同,这个值都有差异。有的时候差异还很大。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 用Python写一个模拟qq聊天小程序的代码实例

    Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput destination IP:") # data = raw_input("Plz imput what you want to submit:") port = 51423 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) tr

  • Python一个简单的通信程序(客户端 服务器)

    功能是从客户端向服务发送一个字符串, 服务器收到后将字符串重新发送给客户端,同时,在连接建立之后,服务器可以向客户端发送任意多的字符串 客户端: 10.248.27.23是我电脑的IP import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput destination IP:") # data = raw_input("Plz imput what you want to submit:&quo

  • Python3转换html到pdf的不同解决方案

    问题:python3 如何转换html到pdf 描述: 我的电脑是windows764位,python3.4 我想用python 转换html到pdf. 我尝试了html2pdf,貌似它只支持Python2 我又尝试了wkhtmltox-0.12.2.2_msvc2013-win64和pdfkit,并用下面的例子测试. import pdfkit pdfkit.from_url('http://google.com', 'out.pdf') 报错信息 Traceback (most recent

  • Python小进度条显示代码

    有的时候程序需要有进度条显示,比如说安装程序.下载文件等场合. 下面有一段小程序可达到效果 程序代码 import time for i in range(0, 101, 2): time.sleep(0.3) num = i // 2 if i == 100: process = "\r[%3s%%]: |%-50s|\n" % (i, '|' * num) else: process = "\r[%3s%%]: |%-50s|" % (i, '|' * num)

  • 举例讲解Python常用模块

    datetime 日期时间类,主要熟悉API,时区的概念与语言无关. from datetime import datetime as dt dt.utcnow() # 系统UTC时间 dt.now() # 系统当前时间 dt(2018, 3, 27, 14, 30) # 获得2018-3-27 14:30对应的datetime对象 dt.now().timestamp() # 秒数1522133962.527885 dt.fromtimestamp(1522133962.527885) # 从

  • Python中一般处理中文的几种方法

    Python中的中文是个很头痛的问题,Python2和Python3都会出现,而且py2中出现的概率要大些. 有一道面试题: Python中如何处理中文问题,能想到的就是以下几方面来规避: 1. 首行添加 # coding = utf-8 # coding = utf-8 # 或者 # -*- coding:utf-8 -*- 2. 字符串前添加u >>> s = u'中文' >>> print(s) 中文 3. 添加以下代码 import sys reload(sys

  • Linux下升级python和安装pip的详解

    Linux版本升级: 1.首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致 所有的python版本都在https://www.python.org/ftp/python/ 选择下载 2. wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz 进行下载 3.解压 tar -zxvf Python-2.7.11.tgz 进入Python-2.7.11目录  输入 ./configure make

  • Python I/O与进程的详细讲解

    I/O with语句 with context_expression [as target(s)]: with-body context_expression返回值遵从上下文管理协议,包含__enter__()与__exit__()方法,as语句的target(s)得到的是__enter__()返回值,执行with-body后会调用上下文管理器的__exit__()方法,使用with语句,可以减轻某些代码编写负担,比如文件读写. 读文件 try: f = open('/path/to/file'

  • Java与Python之间使用jython工具类实现数据交互

    最近有个功能需要java与python之间的数据交互,java需要把参数传给python,然后python计算的结果返回给java.于是就写了一个工具类. 首先,maven 需要加载jython的依赖.工具类代码如下: import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.poi.ss.formula.functions.T; import org.python.co

  • Python高级特性与几种函数的讲解

    切片 从list或tuple中取部分元素. list = [1, 2, 3, 4] list[0 : 3] # [1, 2, 3] list[-2 : -1] # -1表示最后一个,[3, 4] list[1 :: 2] # index = 1开始,每两个取一个[2, 4] list[:] # 复制list,[1, 2, 3, 4] # 针对tuple,切片同样适用 iterable.iterator 可迭代,迭代器,集合类型数据可迭代但不是迭代器,可通过iter()转变为迭代器. 可迭代对象可

随机推荐