2016-05-16 2 views
1

私は再帰を使って配列の中で最大のdoubleを返そうとしています。配列内で最大のdoubleを返します

szは配列内の要素の数です。

startは、現在の呼び出しを開始する配列のインデックスです。

これはこれまで私が行ってきたことです。 'return max'行にヒットしたときに関数が終了しないのはなぜですか?

double arrayMax (double arr[], int sz, int start) { 
double max; 

if (start == sz) { 
    return max; 
} else { 
    if (arr[start] > max) { 
     max = arr[start]; 
    } 
    arrayMax(arr, sz, start+1); 
} 
return max; 

}

+0

関数呼び出しは 'return max;'行に達したときに終了します。 – immibis

+0

return maxをヒットすると、arrayMaxをもう一度呼び出してから、リストの中の最大のdoubleの代わりにリストの最初の要素を返します。 – stumpylumpy

+0

OMG、なぜ誰かがこれに対して再帰を使いたいのですか?これが学校の宿題(1つのように聞こえる)であれば、これはコード作成方法を教えてくれるわけではありません。これはコード作成の仕方を教えてくれるでしょう。スタックオーバーフローについて聞いたことがありますか?大きな配列でこの「アルゴリズム」を試してみると、1つが表示されます。 :) –

答えて

-1

。それは問題を引き起こすでしょう。サイズと開始整数の値が同じであれば返すようにしようとしているので、配列に要素が1つしかないときに起こっていると思います。

私の配列に要素が1つしかない場合は、maxという名前の値を返しますが、内部に何が入っているかは誰にも分かりません。 (未定義の振る舞い)

しかし、それも間違っています。ご覧のように、変数maxに値を与えていますが、すべての呼び出しでそれを定義して宣言しているので、膨大なメモリが必要になります。だから、より良い方法は、あなたの最大変数を与える必要があり、それはあなたの関数のパラメータとして値、それは良い方法です。

第2に、再帰関数を返す方がよいでしょう。あなたは再帰呼び出しで戻り値を持たないからです。両方の場所でこれを行う必要があります。

まず、すべての関数が終了したときに最大値を返す必要があります。次に、関数の最後よりも上の段階で別の再帰呼び出しを行うために関数を返す必要があります。

このコードはゴーストマンと同じですので、私はこのコードで彼と一緒です。

double arrayMax (double maxValue, double myArray[], int arraySize, int startPoint) 
{ 
    if (startPoint < arraySize) 
    { 
     if (myArray[startPoint] > maxValue) 
      maxValue = myArray[startPoint]; 

     return arrayMax(maxValue, myArray, arraySize, startPoint + 1); 
    } 
    return maxValue; 
} 
+0

誰もがdownvoteを説明しますか? – Aconcagua

0
double arrayMax (double max, double arr[], int sz, int start) { 

if (start < sz) { 

    if (arr[start] > max) { 
     max = arr[start]; 
    } 

    return arrayMax(max, arr, sz, start+1); 
} 

return max; 

} 

配列の長さは、それが非常に悪い方法だ決定又は非常に大きくない場合。命令型言語は反復アルゴリズムでうまく機能します。

0

再帰呼び出しでは、startをインクリメントしますが、szをデクリメントしません。したがって、アルゴリズムのリストを行うのが短くなることはありません。投稿コードで

+0

'sz'は配列の終わりを示します。これはfixであり、' start'はそれに向かって動きます。 – Aconcagua

1

問題:

  1. 再帰ロジックは欠陥があります。あなたの関数が実装されている方法では、関数を呼び出すたびに新しいローカル変数maxが作成されます。最大値は再帰呼び出しを介して伝搬されていません。

  2. maxが初期化されずに使用されています。これは未定義の動作につながります。

  3. 再帰呼び出しにreturnがありません。

私は、コアロジックをヘルパー関数で実装することをお勧めします。

double arrayMax (double arr[], int sz, int start) 
{ 
    double max; 
    if(start >= sz - 1) 
    { 
     max = arr[sz - 1]; 
    } 
    else 
    { 
     max = arrayMax (arr, sz, start + 1); 
     if(arr[start] > max) 
     { 
      max = arr[start]; 
     } 
    } 
    return max; 
} 

追加のパラメータ、無ヘルパー関数...すべての

2

まず、あなたは2行目の任意の割り当てられた最大値を持っていない。このことについては何

double arrayMaxHelper(double arr[], int sz, int start, int currentMax) 
{ 
    if (start == sz) 
    { 
     return currentMax; 
    } 

    if (arr[start] > currentMax) 
    { 
     currentMax = arr[start]; 
    } 

    return arrayMaxHelper(arr, sz, start+1, currentMax); 
} 

double arrayMax (double arr[], int sz, int start) 
{ 
    // Call the helper function. 
    // The fact that arrayMax is implemented using a recursive 
    // helper function is a detail. Callers of the arrayMax() 
    // shouldn't have to worry about it. 
    return arrayMaxHelper(arr, sz, start, std::numeric_limits<double>::min): 
} 
関連する問題