由于堆栈溢出,需要使此递归算法迭代

时间:2012-04-14 20:19:08

标签: recursion

基本上我在Python中有这个庞大的功能(我简化为基础)

def rec(a,b):
  if stoppingCondition==True: return 1

  key=(a,b)
  if key in memo: return memo[key]

  if b==side condition:
       memo[key]=rec(a+1,b)   #RECURSIVE CALL
       return memo[key]

  total=0
  for d in D:
      if condition1==True:
          b=some process 1
          total+=rec(a+1,b)   #RECURSIVE CALL
      elif condition2==True:
          for x,y in d:
              if (some break condition==True): break
          else: #only gets called if break didnt happen
              b=some process 2
              total+=rec(a+1,b)   #RECURSIVE CALL
   memo[key]=total
   return memo[key]

我有一段时间使它迭代,因为它会爆发更深层次的递归级别。我已经阅读了有关转换为循环和堆栈的其他线程以及诸如此类但我无法使其中的任何工作。

1 个答案:

答案 0 :(得分:1)

您始终可以为所有rec(a, b)计算b,从最高a开始,在没有递归的简单循环中减少。现在,如果遍历对rec()的所有可能调用都很稀疏,则此解决方案不可行,因为它会引入大量不必要的计算。

另一个解决方案是尝试在Python中实现尾调用优化。我没有尝试过,但你可能想测试this decorator

不太优雅的解决方案是增加递归限制以满足您的需求:

import sys
sys.setrecursionlimit(10000)