从 n = 8 开始的错误:“调用 Python 对象时超出了最大递归深度”[重复]
Posted
技术标签:
【中文标题】从 n = 8 开始的错误:“调用 Python 对象时超出了最大递归深度”[重复]【英文标题】:Error starting at n=8: "maximum recursion depth exceeded while calling a Python object" [duplicate] 【发布时间】:2017-01-25 22:29:52 【问题描述】:我看过其他一些类似的主题,但我无法应用解决方案来修复以下代码给出的错误:
def mult_recursive(a,b):
if b == 1:
return a
else:
return a + mult_recursive(a,b-1)
def factorial_recursive(n):
if n == 0:
return 1
elif n == 1:
return 1
else:
return mult_recursive(n,factorial_recursive(n-1))
print (factorial_recursive(8))
仅当您选择 n >= 8 时才会出错。n 在 0 到 7 的范围内可以正常工作。
如果您能回答我为什么会收到该错误,那就太好了。 谢谢。
PS1:如果您交换 mult_recursive fct 的参数,则该代码适用于所有数字 (n,factorial_recursive(n-1)) => (factorial_recursive(n - 1),n)
PS2:我知道计算阶乘有更简单更好的方法,但我只是想了解为什么会出现从 n=8 开始的错误。
【问题讨论】:
请注意,以递归方式计算简单的乘法肯定是在滥用递归......而且它确实是最终给你这个错误的原因。 @Padraic Cunningham 为什么这是重复的?这是一个嵌套在递归函数中的递归函数 @doshin,你有1000000个嵌套函数没关系,错误原因是一样的。 @Padraic Cunningham,你是对的。谢谢 【参考方案1】:您收到该错误是因为您已超出最大递归深度。你到底误解了什么?逐行计算并计算您拨打电话的深度。如果你超过了最大递归深度,你就完成了。对于n==8
,您似乎超过了它。对于你没有的降低。
这是有道理的,因为对于n==8
,您有factorial_recursive(n-1) == 5040
,因此mult_recursive(n, factorial_recursive(n-1))
执行5040
嵌套调用。这绝对是太多了。
对于n == 7
,您只能进行720
嵌套调用。默认情况下,最大递归是1000
(可能取决于您的机器/python 版本)所以你去吧。
【讨论】:
感谢您的回答。比,如果我交换论点,为什么它会起作用?请看PS1 @doshin 因为mult_recursive
中的递归调用取决于第二个参数,而不是第一个。
@freakish 6,对。而且它会更快地达到极限。现在我仍然不明白为什么如果我设置更大的递归限制它不适用于 8。也不适用于 10k。【参考方案2】:
只是为了说明您可以通过设置递归深度来使用 8 来做到这一点。 在代码开头包含两个语句:
import sys
sys.setrecursionlimit(n)
这里的n是递归深度。如果将其设置为 5042,则该功能可以正常工作。 对于大于 8 的数字,将递归深度设置得更高 例如: sys.setrecursionlimit(10000)
【讨论】:
感谢您的回答。我已经用 5042 和 10k 更改了限制,但仍然不起作用。以上是关于从 n = 8 开始的错误:“调用 Python 对象时超出了最大递归深度”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jython 从 Java 代码调用 Python 导致错误:ImportError: no module named nltk