3

我正在使用 Python 2.7.3 并具有此功能:

def f(n):
    if n == 0:
        return 0
    else:
        return (n % 3 == 0 or n % 5 == 0) * n + f(n - 1) 
f(999)

它在 f(993) 之前有效,但在 f(999) 之前无效。当我尝试时,不断弹出无数错误。我不明白。谁能告诉我怎么了?

编辑: 谢谢大家的回答。我想我最好在 python 中使用迭代。

4

3 回答 3

4

在 Python 中,递归仅限于999次递归调用。

如果你真的想改变递归调用的限制,你可以使用sys.setrecursionlimit(limit)

例如:

sys.setrecursionlimit(2000)

但是,更改递归限制可能很危险。堆栈帧可能会变得太大。

从文档:

此限制可防止无限递归导致 C 堆栈溢出和 Python 崩溃。可以设置setrecursionlimit()

你可以做的是:

就像@Dan D. 所说,你最好迭代地重写你的代码。这就是你应该这样做的原因

于 2013-04-20T10:04:45.183 回答
3

最好使用迭代:

def f(n):
    s = 0
    while n > 0:
        s += (n%3==0 or n%5==0)*n
        n -= 1
    return s
print f(999)

输出:

233168

也可以这样写sum

def f(n):
    return sum((n%3==0 or n%5==0)*n for n in reversed(range(1,n+1)))
于 2013-04-20T09:53:38.520 回答
3

正如您已经从其他答案中了解到代码失败的原因一样,您可能已经通过增加递归限制或使用迭代解决方案获得了替代解决方案

或者,有一种更聪明的方法来解决您的问题,这需要对您实际想要实现的目标进行一些反省

将 3 和 5 的所有因数相加,从 0 到 N

这简单地归结为

>>> def fn_ab(n):
    numbers = [0]*n
    numbers[0:n:3] = range(0,n,3)
    numbers[0:n:5] = range(0,n,5)
    return sum(numbers)
于 2013-04-20T10:27:46.987 回答