2012-01-21 13 views
1

原則として、反復関数を反復関数に変換することが可能であることを読んでいます。私はお互いを呼び出すいくつかの機能を持っています。私は自分のフローチャートを見てコードの構造を構築しました。再帰的なスタイルでそれを行うのは明らかです。小さなサイズの問題には適していますが、より大きなスケールではセグメント化の失敗があります。だから私は反復的なスタイルに切り替えることを試みているが、分岐構造が私を混乱させるので、それを技術的に行う方法を想像することはできない。誰かが私にそれを扱う手がかりを与えることができますか?コードはPythonのようなものです:ネストした再帰関数の束を反復関数に変換

def main_function(parameters): 
    if condition0: 
     .... 
     if condition1: 
      .... 
      if condition2: 
       .... 
       return function1(parameters) 
      else: 
       .... 
       return function2(parameters) 
     else: 
      return function1(parameters) 
    else: 
     return function2(parameters) 
############################################# 
def function1(parameters): 
    if condition3: 
     ... 
     return function3(parameters) ### yet another function.. so messed up? :-(((
    else: 
     return main_function(parameters) 
############################################## 
def function2(parameters): 
    if condition4: 
     ... 
     return main_function(parameters) 
    else: 
     return function1(parameters) 
############################################### 
def function3(parameters): 
    if condition5 
     if condition6: 
     ... 
     return function3(parameters) 
     else: 
     ... 
     return main_function(parameters) 
    else: 
     return RESULTS # The only way out! 

大変ありがとうございます、どうもありがとうございます。

+1

私は「すべての再帰関数がスタックベースの1のように記述することができる」と考えるのが好き。それが役立つかどうかはわかりません。 – Oded

答えて

1

あなたが示した文はすべてreturn some_other_function()なので、state machineはこれをモデル化する自然な方法です。各関数に対応する状態が存在し、returnステートメントは状態遷移になります。

+0

答えをありがとう、私はfsmの簡単な研究を作ったが、私はプロのプログラマーではない、それが可能であるかのようにしている間、または同様の "シンプル"なもの?? –

0

すべての再帰呼び出しはreturnステートメントで開始されるため、古いスタックを保持する必要はありません。たとえば、function1()return function3()とコールされた場合、function1スタックを削除できます。この方法ではRuntimeError: maximum recursion depth exceededを取得しません。

これは、再帰的に呼び出すのではなく、パラメータを使用して呼び出すために連続する関数を返すことで実現できます。

def main_function(parameters): 
if condition0: 
    if condition1: 
     if condition2: 
      return function1, parameters # return function to call next with arguments 
     else: 
      .... 
      return function2, parameters 
    else: 
     return function1, parameters 
else: 
    return function2, parameters 

他の機能も同様の方法で変更する必要があります。次のように今、あなたはmain_function()を呼び出すことができます。

next_function, next_fun_param = main_function(parameters) 
while hasattr(next_function, '__call__') 
    next_function, next_fun_param = next_function(next_fun_param) 
# got the RESULT 
+0

これはうまくいくようですが...ありがとう –

関連する問題