从 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

从 django 子进程调用 python,mysql not found 错误

gsutil cp 通信问题

习题8-4 报数(20 分)

习题8-4 报数 (20分)

将 n 位从 8 位数组复制到 64 位整数?