在python中递归调用大约(2 ^ 60)+次的方法

时间:2016-06-29 17:00:47

标签: python

我遇到的情况是应该递归调用一个方法大约(2 ^ 60)次或更多次

我成功地达到2 ^ 9然后导致"超过最大递归深度"有没有办法做到这一点

我正在尝试将其更改为迭代方法

我正在使用Python语言

4 个答案:

答案 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)

Python Docs:

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次递归调用。