我在这里有这个尾部递归函数:
def recursive_function(n, sum):
if n < 1:
return sum
else:
return recursive_function(n-1, sum+n)
c = 998
print(recursive_function(c, 0))
它工作到了n=997
,然后它破裂并吐出了RecursionError: maximum recursion depth exceeded in comparison
。这只是堆栈溢出吗?有办法解决吗?
是的,它可以防止堆栈溢出。Python(或更确切地说,CPython实现)无法优化尾部递归,无限制的递归会导致堆栈溢出。您可以使用以下方法检查递归限制sys.getrecursionlimit
:
import sys
print(sys.getrecursionlimit())
并使用以下方式更改递归限制sys.setrecursionlimit
:
sys.setrecursionlimit(1500)
但是这样做很危险-标准限制有些保守,但是Python堆栈框架可能会很大。
Python不是一种功能语言,尾部递归并不是一种特别有效的技术。如果可能的话,迭代地重写算法通常是一个更好的主意。
问题内容: 这个尾部递归函数: 它工作到了,然后它破裂并吐出了。这只是堆栈溢出吗?有办法解决吗? 问题答案: 是的,可以防止堆栈溢出。Python(或更确切地说,CPython实现)不能优化尾部递归,无限制的递归会导致堆栈溢出。你可以使用来检查递归限制,并使用来更改递归限制,但是这样做很危险-标准限制有些保守,但是Python堆栈框架可能会很大。 Python不是一种功能语言,尾部递归并不是一种特
我对Python很陌生。我写了一个关于返回 x 在排序的重复元素数组 A 中的出现次数的函数: 错误是:运行时错误:超出最大递归深度。有人知道如何解决它吗?
问题内容: Python具有最大的递归深度,但没有最大的迭代深度。为什么限制递归?像迭代一样对待递归而不限制递归调用的数量会更自然吗? 让我只说这个问题的根源在于尝试实现流。例如,假设我们要编写一个流以产生自然数: 流的递归定义非常吸引人。但是,我想更好/更多的pythonic方法是使用生成器。 问题答案: 实际上这里有一些问题。 首先,正如NPE的回答很好地说明的那样,Python不会消除尾部调
问题内容: 我使用以下代码解决了Euler项目的问题10,该代码通过强力工作: 这三个功能的工作方式如下: isPrime 检查数字是否为质数; primeList 返回一个列表,其中包含一组在一定范围内且限制为“ n”的素数,并且; sumPrimes 对列表中所有数字的值求和。(不需要最后一个功能,但是我喜欢它的清晰度,特别是对于像我这样的初学者。) 然后,我编写了一个新函数 primeLis
问题内容: 我从星期一开始使用Python进行编程。我很喜欢学习它。但是我一直试图了解如何在tkinter菜单之间切换时避免递归!我确信这是一个非常基本的问题,感谢您宽容我对此主题的无知,但我无法在其他地方找到答案。 我现在正在做的最终是给我错误:RuntimeError:调用Python对象时超出了最大递归深度 这是我目前正在使用的模式。更新:下面的代码现在是完整的隔离副本,再现了我面临的问题!
问题内容: 为了估计在给定内存量下递归方法可能实现的最大调用深度,在可能发生堆栈溢出错误之前,用于计算所用内存的(近似)公式是什么? 编辑: 许多人以“取决于”来回答,这是合理的,因此让我们通过一个简单但具体的示例来删除一些变量: 很容易看出,在我的Eclipse IDE中运行该命令时爆炸的次数不到1000(对我来说这很低)。是否可以在不执行此调用深度限制的情况下进行估算? 编辑:我不禁想到Ecl