1

基本的に私は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]

そして、それがより深い再帰レベルのために爆発するので、私はそれを反復的にするのにかなりの時間を費やしています。ループやスタックへの変換などについては、他のスレッドをすでに読んでいますが、どれも機能させることができません。

4

1 に答える 1

1

再帰なしの単純なループで、最高から始めて減少するrec(a, b)すべてについて、いつでも計算できます。現在、このソリューションは、すべての可能な呼び出しのトラバースがスパースである場合、多くの不要な計算を導入するため、実行可能ではありません。barec()

もう1つの解決策は、Pythonで末尾呼び出しの最適化を実装することです。試したことはありませんが、このデコレータをテストすることをお勧めします。

あまり洗練されていない解決策は、必要に応じて再帰制限を増やすことです。

import sys
sys.setrecursionlimit(10000)
于 2012-04-14T20:46:48.980 に答える