0

我写了一个递归函数来计算一个双精度数组的总和。由于某些原因,我的递归函数返回的值不正确。实际上,我的递归总和与我的迭代总和不匹配。我知道我在某个地方犯了一个小错误,但我看不出在哪里。您的帮助将不胜感激。我只粘贴了递归函数。我在 Visual Studio 上使用 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

好吧,因为没有元素的总和为零,而不是负一。

if (size_ar == 0.0)
    return 0.0;

可以这样想:sum(1,2,3)相同和sum(1,2) + sum(3)相同sum(1,2,3)+sum()——在所有三种情况下,你将 1、2 和 3 加在一起,只是方式略有不同。这也是为什么没有元素的乘积是一的原因。

于 2013-03-12T13:31:54.660 回答
1

尝试更改“if(size_ar== 0) return -1;” 返回 0。

于 2013-03-12T13:31:50.120 回答
0

虽然这并不能解释输出中的巨大差异,但要记住的另一件事是,一旦您解决了返回-1vs.的问题,操作的顺序0...... IEEE 浮点运算不一定是可交换的,所以请确保当您执行递归与迭代方法时,您以完全相同的顺序将数字相加,否则您的输出可能仍会相差一些 epsilon 值。

例如,当前在您的递归方法中,您正在将数组最后一个成员的值与数组的第一个成员反向相加。由于浮点数学的非交换性质,这可能会给您一个稍微不同的值(小 epsilon),而不是您将数组中的值从第一个到最后一个相加。这可能不会cout在浮点值被截断到特定固定小数位的简单情况下显示,但是如果您尝试在==不包含一些 epsilon 值的情况下对两个不同的求和使用该操作,结果可能仍会测试为假。

于 2013-03-12T13:35:29.757 回答