0

doubleの配列の合計を計算する再帰関数を作成しました。いくつかの理由で、再帰関数によって返される値が正しくありません。実際、私の再帰的な合計は私の反復的な合計と一致しません。どこかで少し間違えたのは知っていますが、どこかわかりません。あなたの助けは非常に高く評価されます。再帰関数のみを貼り付けました。VisualStudioでC++を使用しています。ありがとう!

double recursive_sum(double array_nbr[], int size_ar)
{ double rec_sum=0.0;
if( size_ar== 0) 
    return -1;
else if( size_ar> 0)
       rec_sum=array_nbr[size_ar-1]+recursive_sum(array_nbr,size_ar-1);

return  rec_sum;
}

 //####  Output######


 The random(s) number generated in the array =
 0.697653  |  0.733848  |  0.221564  |



 Recursive sum: 0.653066

 Iterative sum: 1.65307

 Press any key to continue . . .
4

3 に答える 3

4

無要素の合計はマイナス1ではなくゼロだからです。

if (size_ar == 0.0)
    return 0.0;

このように考えてみてください:sum(1,2,3)は同じsum(1,2) + sum(3)であるのと同じですsum(1,2,3)+sum()— 3 つのケースすべてで、わずかに異なる方法で 1、2、および 3 を足し合わせます。要素のない製品が 1 である理由もここにあります。

于 2013-03-12T13:31:54.660 に答える
1

「if( size_ar== 0) return -1;」を変更してみてください。0 を返す。

于 2013-03-12T13:31:50.120 に答える
0

-1これは出力の大きな不一致を説明するものではありませんが、 vsを返す問題を修正した後の演算の順序についても留意すべき0です。IEEE 浮動小数点演算は必ずしも交換可能ではないため、再帰的な方法と反復的な方法を実行している場合は、まったく同じ順序で数値を合計します。そうしないと、出力がイプシロン値によって異なる場合があります。

たとえば、現在の再帰メソッドでは、配列の最後のメンバーの値を逆に、配列の最初のメンバーに加算しています。これは、浮動小数点演算の可換性がないため、配列内の値を最初から最後まで合計した場合とはわずかに異なる値 (小さいイプシロン) を与える可能性があります。これはおそらく、浮動小数点値が特定の固定小数点位置に切り捨てられる単純なものでは表示されませんが、イプシロン値を組み込まずに 2​​ つの異なる合計で演算coutを使用しようとすると、結果は依然として false とテストされる場合があります。==

于 2013-03-12T13:35:29.757 に答える