2

私は理解するのがかなり難しいアルゴリズムを持っているので、変数への単一の割り当ての形でそれを書き留め、constその間になぜそうしているのかを説明する多くのコメントを付けました。アルゴリズムが解決策を拒否するたびに、returnステートメントが導き出されます。

一方、顧客は、constこのシナリオで変数を使用できる唯一の方法はネストされたifブロックがたくさんあるため、メソッドに「初期の」return ステートメントがないことを要求しました。これはやや矛盾する目標です。

両方の世界を最大限に活用できるエレガントなソリューションはありますか?変数がスコープ内にあり、階層がややフラットである場合に有効な変数はありますか?

編集:顧客は例外とgoto. これはホット パスであり、ソリューション ジェネレーターから提案されたソリューションが受け入れ可能であり、以前のソリューションよりも優れているかどうかを判断する決定ツリーを実装します。

ネストされた if のスコープは次のようになります

if(fulfills_condition_1(sol)) {
    double const some_quality = quality_function_1(sol);
    double const normalized_quality = normalize_quality_1(some_quality);
    if(fulfills_condition_2(normalized_quality) {
    {
        double const another_quality = ...
    }
}

私の現在のアプローチは次のようになります

if(!fulfills_condition_1(sol))
    return;
double const some_quality = quality_function_1(sol);
double const normalized_quality = normalize_quality_1(some_quality);
if(!fulfills_condition_2(normalized_quality) {
    return;

...

update_current_solution(sol);
4

4 に答える 4

5

一方、顧客は、メソッドに「早期の」returnステートメントがないことを要求しました

この要件は、通常C ++で必要なように、クリーンアップにデストラクタが使用されている場合、C++の世界でコードを改善することはありません。

複数の戻り値を持つ関数全体の重複をクリーンアップしないようにすることは、Cコードでのみ役立ちます。そして、これはまさにLinuxカーネルに使用されるスタイルです。

于 2012-11-19T16:26:20.563 に答える
1

1つの方法は、アルゴリズムをいくつかの関数にリファクタリングして、リターンによって見逃されるはずのコードが新しい関数に入れられ、テストが逆になるようにすることです。(ただし、例外なく、これは元のコードよりもエレガントではないと思います)

とてもオリジナル

T algorithm_fn() {
  T result;
  ...
  if (x) {
    return result;
  }
  //do more
}

になります

T new_func( // the const parameters ) {
    //do more
}

T algorithm_fn() {
  T result;
  ...
  if (!x) {
     result = new_func( // the const parameters );
  }
  return result;
}
于 2012-11-19T16:32:24.007 に答える
1

これが「顧客の要件を回避する」カテゴリに分類されるかどうかはわかりませんが、do/while ループを使用して、一度だけ実行したいコード ブロックから抜け出すことができます。

int foo()
{
    int value = 0;
    do
    {           
       if ( condition1 ) { ... }
       else { break; }
       if ( condition2 ) { ... }
       else { break; }
    } while ( false )  // the do/while loop is only run through once.

    // do whatever clean up etc is needed.

    return value;      
 }
于 2012-11-19T16:41:09.237 に答える
-1

これは、gotoが受け入れられる唯一の構造の1つだと思います。returnステートメントを使用してメソッドの最後に移動するのではなく、戻り値を変数に割り当てます。

于 2012-11-19T16:25:17.457 に答える