【问题标题】:Need to make this recursive algorithm iterative due to stack overflow由于堆栈溢出,需要使这个递归算法迭代
【发布时间】:2012-04-26 18:36:23
【问题描述】:

基本上我在 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]

而且我花了很长时间让它迭代,因为它爆炸了更深的递归级别。我已经阅读了有关转换为循环和堆栈之类的其他线程,但我无法让它工作。

【问题讨论】:

  • 我正在尝试一种堆栈方法

标签: recursion


【解决方案1】:

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

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

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

import sys
sys.setrecursionlimit(10000)

【讨论】:

  • 我尝试了 setrecursionlimit ,但不幸的是还不够。您发布的装饰器也无法正常工作(我的函数返回错误的值)。不确定从最高 a 开始循环所有 b 是什么意思。
  • 您是否尝试增加setrecursionlimit 的值?当你增加很多时发生了什么?如果您知道a 的最大值,那么您可以开始计算所有b 的最大值a 的值,以此类推。
  • 当我从 main() 调用我的函数时,我使用 a=0 和 b=0 的列表。
  • 我正在尝试堆栈方法,但没有得到任何结果...如何考虑停止条件?
猜你喜欢
  • 2012-07-24
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2014-08-26
  • 2015-04-04
  • 2017-01-20
  • 2018-12-02
相关资源
最近更新 更多