我写了一个递归函数来计算double数组的总和。由于某些原因,我的递归函数返回的值不正确。实际上,我的递归总和与我的迭代总和不匹配。我知道我在某个地方犯了一个小错误,但我看不到哪里。非常感谢您的帮助。我只粘贴了递归函数。我在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 . . .
答案 0 :(得分: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加在一起,只是以一种不同的方式。这也是为什么没有元素的产品就是一个。
答案 1 :(得分:1)
尝试更改“if(size_ar == 0)return -1;”返回0。
答案 2 :(得分:0)
虽然这并不能解决您的输出中存在的巨大差异,但要记住的另一件事是,一旦您修复了返回-1
与0
的问题,就会对操作进行排序。 IEEE浮点运算不一定是可交换的,因此请确保在执行递归与迭代方法时,将数字按完全相同的顺序相加,否则输出可能会因某些epsilon值而不同。
例如,目前在您的递归方法中,您将数组的最后一个成员的值与数组的第一个成员相反。由于浮点数学的非交换属性,这可能会给你一个稍微不同的值(小epsilon),而不是从第一个到最后一个总结数组中的值。这可能不会显示在一个简单的cout
上,其中浮点值被截断为特定的固定小数位,但是如果您尝试在两个不同的求和上使用==
操作而不合并某些epsilon值,结果可能仍然是错误的。