0

这应该是 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
4

2 回答 2

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
于 2013-03-15T18:16:26.740 回答
0

问题是您正在尝试使用浮点数并且代码无法处理。因此,1.5 -1 变为 0.5,这会导致第一次递归调用。然后,0.5 -1 变为 -0.5,这会导致进一步的递归调用。

只是为了处理它,请使用:-

如果 n<=0:返回 1

于 2013-03-15T18:13:06.973 回答