Python,IDLE:递归错误太多

时间:2013-03-15 18:07:21

标签: python recursion runtime-error python-idle python-3.3

这可能是Python的IDLE编辑器的一个问题。 (我在OSX上运行Python 3.3.0,但2.7.3也出现了同样的问题)

我正在使用IDLE编写Python程序。我的问题是:调用一个递归函数,它调用自己太多次(1000次),并没有给我一个运行时错误,而是,它一直向我发送错误消息,直到我关闭程序。

它应该发送的错误是:“RuntimeError:超出最大递归深度。” 它发送一千次的错误并不仅仅是脚本在问题所在的位置:

Traceback (most recent call last):
  File "<pyshell#112>", line 1, in <module>
    factorial(1.5)
  File "/Users/User/Documents/Python/Scripts/program1.py", line 187, in factorial
    recurse = factorial(n-1)
  File "/Users/User/Documents/Python/Scripts/program1.py", line 187, in factorial
    recurse = factorial(n-1)

这适用于所有调用自身的递归函数,但这里使用的具体函数是:

def factorial(n):
    if n == 0:
        return 1
    else:
        recurse = factorial(n-1)
        result = n * recurse
        return result

2 个答案:

答案 0 :(得分:1)

要阻止python显示数百个错误,您可以使用try-except块:

def factorial(n):
    if n == 0:
        return 1
    else:
        recurse = factorial(n-1)
        result = n * recurse
        return result
try:
    print (factorial(6000))
except RuntimeError as e:
    print (e)

输出:

#print factorial(1000)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

#print factorial(6000)
maximum recursion depth exceeded in comparison

在你的情况下出现这个错误是因为python对最大递归深度有限制,它可以阻止C堆栈溢出。但您可以使用sys.setrecursionlimit更改它:

In [4]: import sys

In [5]: sys.getrecursionlimit()
Out[5]: 1000

答案 1 :(得分:0)

问题是你正在尝试使用float并且代码不能处理它。因此,1.5 -1变为0.5,这将导致第一次递归调用。然后,0.5 -1变为-0.5,这将导致进一步的递归调用。

为了处理这个问题,请使用: -

  

如果n <= 0:返回1