我遇到的情况是应该递归调用一个方法大约(2 ^ 60)次或更多次
我成功地达到2 ^ 9然后导致"超过最大递归深度"有没有办法做到这一点
我正在尝试将其更改为迭代方法
我正在使用Python语言
答案 0 :(得分:2)
您需要将功能更改为迭代而不是递归 例如:
def recursionSum(n):
if n==0:
return 0
return n + recursionSum(n-1)
def iterativeSum(n):
sum = 0
while(n>0):
sum += n
n = n-1 # update parameter and loop again
return sum
你需要这样做,因为即使你的函数是尾递归的(在完成后不在堆栈上维护一个调用框架)python也不会对它进行优化。所以你不能在python中使用长递归调用。重构您的代码以进行迭代。提供您的代码,我可以指导您完成整个过程。
编辑:这是你可以阅读关于尾递归(What is tail recursion?)
的内容答案 1 :(得分:1)
正如你所说,你看到涉及Bellman方程的东西,我建议你寻找有关它的实现。
快速Google搜索this example on GitHub by rncarpio。
我还没有深入了解它,但它可能会给你一些东西要么使用,要么基于你自己的实现。
答案 2 :(得分:0)
redisMulti.exec(function(deleteErr, deleteSuccess){ process.nextTick(function(){ scanRedis(key, function(err, reply){ process.nextTick(function(){ callback(false, true); }); }); }); });
将Python解释器堆栈的最大深度设置为limit。此限制可防止无限递归导致C堆栈溢出并导致Python崩溃。
可能的最高限制取决于平台。当用户需要深度递归的程序和支持更高限制的平台时,用户可能需要设置更高的限制。这应该小心,因为过高的限制可能导致崩溃。 (强调我的)
所以在你的功能之前放置sys.setrecursionlimit(limit)
或者你需要它。如文档中所述,您的平台可能会对sys.setrecursionlimit(n)
设置限制。但是在python解释器中无法实现n
。因此,我建议您迭代地而不是递归地实现您的函数。
答案 3 :(得分:0)
您可以尝试以下操作:
import sys
sys.setrecursionlimit(n)
其中n
是一个很大的数字。这是由解释器设置的限制,另一个限制由OS设置。因此,对于较大的n
,您会看到不同的错误消息。绝对无法实现2 ^ 60次递归调用。