2016-05-16 5 views
0

私は整数配列の内容を合計するだけの小さなC++プログラムを持っています。デバッグ出力は、再帰関数が正しく呼び出されたことを示します。私も配列のアドレスをチェックしました - それはすべて同じです。単純なC++再帰が正しく動作しません - 私はなぜそれがわかりません

なぜこのコードがこの奇数を最後に出すのか理解できません。私は明らかに何か間違っているが、私はそれを得ていない。誰かが正しい方向にポインタを持っていますか?

#include <iostream> 
using namespace std; 

int arr_sum(int arr[], int idx) { 
    // debug 
    cout << "arr[" << idx << "] = " << arr[idx] << " (" << arr << ")" << endl; 

    if (idx > 0) { 
     return arr[idx] + arr_sum(arr, idx - 1); 
    } 
} 

int main() { 
    int a[10]; 
    a[0]=1; a[1]=2;a[2]=3;a[3]=4; a[4]=5; 
    a[5]=6; a[6]=7;a[7]=8;a[8]=9; a[9]=0; 

    cout << a << endl; // debug 
    cout << "Sum: " << arr_sum(a, 9) << endl; 
} 

出力:あなたは、基本ケースを忘れてしまった

0x7ffc7c3fc7e0 
arr[9] = 0 (0x7ffc7c3fc7e0) 
arr[8] = 9 (0x7ffc7c3fc7e0) 
arr[7] = 8 (0x7ffc7c3fc7e0) 
arr[6] = 7 (0x7ffc7c3fc7e0) 
arr[5] = 6 (0x7ffc7c3fc7e0) 
arr[4] = 5 (0x7ffc7c3fc7e0) 
arr[3] = 4 (0x7ffc7c3fc7e0) 
arr[2] = 3 (0x7ffc7c3fc7e0) 
arr[1] = 2 (0x7ffc7c3fc7e0) 
arr[0] = 1 (0x7ffc7c3fc7e0) 
Sum: 6295692 
+1

ステップを忘れて、問題が明らかであろう。 –

+0

'else'はすべての違いをもたらします。 – IInspectable

+1

'arr_sum(arr、0)'は何を返しますか? – immibis

答えて

1
if (idx > 0) { 
    return arr[idx] + arr_sum(arr, idx - 1); 
} 

あなたが終了する場合に、デバッガでそのコードを

if (idx > 0) { 
    return arr[idx] + arr_sum(arr, idx - 1); 
} else return arr[0]; 
+1

Uhm .. else else arr [0]; ' – IInspectable

+0

これは、合計から 'arr [0]'の値を除外します。私はさらなる再帰の条件は 'idx> = 0'でなければならないと思います。 (OPはarr [-1]にアクセスしないように、この場合はOPで "debug"出力を取り除かなければならないでしょう)。あるいは実際に、@ IInspectableは終了枝で 'return arr [0]'と言っています。 – TerraPass

+0

@TerraPass:いいえ、 'idx> = 0'は動作しません。なぜなら、arr_sumへの再帰呼び出しは' idx-1'になるからです。 – Mark

1

idxがゼロの場合arr_sumリターンを何?

今のところ、関数は何も返しません。これは不正です。コンパイラの警告を表示すると、すべてのコンパイラが警告します。実行すると、スタックにランダムな値が残って終了し、戻り値として解釈され、他の結果に追加されます。

+0

私はそれがとても単純なものであることを恐れていました。はい、ありがとうございます。コンパイラの警告が表示され、btw(GCC 4.6.3)、この問題を警告していないようです。 – Mark

関連する問題