2009-09-17 16 views
2

はい、私は文言が理解するのは難しいと知っていますが、これはバグの多いものです。最近のプロジェクトでは、私は再発する機能を持っています。再帰を止めるような条件が数多くあります。どちらの状況がオプションか? (I.E.最高性能または最も簡単なメンテナンス)。条件付きで関数を実行する最善の方法は?

1)条件付きリターン:

void myRecursingFunction (int i, int j){ 
    if (conditionThatWouldStopRecursing) return; 
    if (anotherConditionThatWouldStopRecursing) return; 
    if (thirdConditionThatWouldStopRecursing) return; 

    doSomeCodeHere(); 
    myRecursingFunction(i + 1, j); 
    myRecursingFunction(i, j + 1); 
} 

2)if文

void myRecursingFunction (int i, int j){ 
    if (
     !conditionThatWouldStopRecursing && 
     !anotherConditionThatWouldStopRecursing && 
     !thirdConditionThatWouldStopRecursing 
    ){ 
     doSomeCodeHere(); 
     myRecursingFunction(i + 1, j); 
     myRecursingFunction(i, j + 1); 
    } 
} 

3で全体を包んで)あなたはそれを間違ったのnoobをやっている、何もまともなアルゴリズムは、これまで再帰を使用しないだろう。

+0

最初の例は、2番目の例で||を使用するのと同じです。したがって、2つの例は同じことをしません。 –

+0

@Lasse - ハァッ?それがあなたを混乱させるなら、私は条件文も否定します。 – MiffTheFox

答えて

6

どちらのアプローチも、同等のブール表現であるため同じ場面で同じILコードになるはずです。各終了条件は、コンパイラがどちらを実行する可能性が最も高いかを判断できないため、書き込む順に評価されるため、最も一般的な終了条件を最初に置きたいと考えます。

structured programmingは2番目のアプローチが優れていると言いますが、個人的には、リカーシブメソッドの先頭にある別のブロックとしてリターン条件をコーディングする方が好きです。私はそれを読みやすく、フォローするのが簡単だと思います(私はメソッド本体のランダムな領域でのリターンのファンではありません)。

3

これは、再帰を停止する条件が何であるかを完全に明確にしているので、私は最初の解決方法を選択します。 より読みやすく、保守性が向上しています。

1

は、私は、ここでバリアント2. 3つの否定を理解する必要がと一緒にそれらすべてをチェーンし、読みはるかに簡単であるバリアント1より良い...

が好きです。私はそれが "難しい"ではないことを知っていますが、異形1についてはずっと長い時間がかかります。

3

速い必要がある場合は、できるだけ早く一般的なケースに当てることをおすすめします(つまり、ベースケースを最後に置くことは1度だけ行うためです)。また、再帰句の前に基底case-1を置くことについて考えてください(つまり、後続の呼び出しのエントリでチェックするのではなく、関数を呼び出す前にテストを実行してください)。

そして、問題がなければ最適化しないでください。私は最初に明確にするつもりです。

+0

私はそれが違いを疑う。戻り値の順序にかかわらず、再帰の前に基本ケースをテストする必要があります。 – recursive

+0

どちらかの場合はyesです。私は、複数のフロー(switch/caseステートメントや入れ子式ifなど)を持つ関数を考えていました。しかし、この質問のために、はい、あなたは正しいです。 – Joe

0

私の投票はオプション#1でもあります。それは私にはっきりと見える。

関連する問題