2016-09-15 5 views
-1

配列の要素の合計を再帰的に計算する関数を作成しようとしています。私は反復ごとに配列を半分にするというアプローチを試したかったのです。配列を分割して合計を再帰的に計算する

これまで私がこれまで持っていたことは次のとおりです。

int sumRec(int *A, int n, int start, int end) 
{ 
    if (start == end){ 
     return A[end]; 
    } 
    mid = n/2; 
    return sumRec(A, n, start, mid) + sumRec(A, n, start, mid + 1); 
} 

私は適切なトラックにいますか?おかげさまで

+0

仕事をする可能性が類似したコードは、それが動作するかしないのか? – Rotem

+0

私は 'mid =(start + end)/ 2'を見ることができます。また、関数を2つに分割すると便利です:パラメータAとNで非再帰的、パラメータA、開始と終了で再帰的です。 –

+0

なぜ人々はコードを試してみることを恐れていますか?誰もテストするために空のプロジェクトを作成すると思いませんか?彼らはideone.comのようなサンドボックスを認識していませんか? – kfsone

答えて

1

関数にnを渡す必要はありません。これは不要です。 現在、プログラムはの無限再帰で実行されます。

あなたはあなたのコード内でより多くのエラーがあります

mid = (start+end)/2;

を使用することができます。

はここ

int sumRec(int *A, int start, int end) 
{ 
    if (start <= end) 
    { 
     int mid = (start+end)/2; 
     return A[mid] + sumRec(A,start, mid-1) + sumRec(A,mid+1,end); 
    } 
    return 0; 
} 
+0

[tailとnon-tail recursion](https://www.quora.com/What-is-tail-recursion-Why-is-it-so-bad)に基づいて最適化を検討するとよいでしょう。あなたの例では、計算は再帰呼び出しの戻りの後に行われます。 – PRP