2012-02-15 14 views
1

を破る私は、再帰的なアルゴリズムを実装しています:誘導リターン:reccursion

def induct(arg): 
    if doStuff(arg) == 0: 
     return # Completely stop algorithm, go home. 

    induct(doStuff(arg)) 

問題はreturnだけinduct現在コールを返すことです。アルゴリズムを完全に停止させるためにすべてのinduct呼び出しを返す方法はありますか?

+0

が、あなたはそれを避けるために、アルゴリズムを変更することができれば、それはおそらく、きれいにされるだろう。 – delnan

+0

再帰を反復に変換すると問題が解決する可能性があります。 – juliomalegria

答えて

4

returnの代わりに例外を発生させます。

+1

例外を発生させることは、アルゴリズムを停止することとは大きく異なります。いずれにしても、この問題は必要ありません。 –

+2

@DavidRobinsonは真ではありません。発電機が疲弊していることを示し、反復が止まるとはどのように考えていますか?例外を発生させます( 'StopIteration')。 –

+1

私はそれがどう関係しているのか分かりません。私のコメントでは、誰かが関数を呼び出すだけであれば、a)try/exceptでそれを囲みたくないかもしれないし、b)値を返すかもしれないということです。例外を使用して他のプロセスを停止させることは、これとは何の関係もありません。 –

2

あなたが引用した場合、その返信文に戻り、すべての呼び出しが返され、アルゴリズムは停止されます。

ETA:これはいずれでもtail-recursive functionに該当します。

+0

それは私のためではありません... – Randomblue

+1

おそらくあなたはこの例ではなく実際のコードを投稿することができますか?あなたが投稿する例では、モーメントの戻り値が呼び出され、すべての関数がすべてスタックに返されます。 –

+0

@DavidRobinson:気にしないで、私のバグを見つけました。 :^) – DSM

1

あなたは、再帰呼び出しの前returnを追加する必要があります。ハックによって可能

def induct(arg): 
    if doStuff(arg) == 0: 
     return # Completely stop algorithm, go home. 

    return induct(doStuff(arg)) 
関連する問題