我的递归函数没有返回正确的值

时间:2013-03-12 13:29:46

标签: c++ function recursion sum double

我写了一个递归函数来计算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 . . .

3 个答案:

答案 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)

虽然这并不能解决您的输出中存在的巨大差异,但要记住的另一件事是,一旦您修复了返回-10的问题,就会对操作进行排序。 IEEE浮点运算不一定是可交换的,因此请确保在执行递归与迭代方法时,将数字按完全相同的顺序相加,否则输出可能会因某些epsilon值而不同。

例如,目前在您的递归方法中,您将数组的最后一个成员的值与数组的第一个成员相反。由于浮点数学的非交换属性,这可能会给你一个稍微不同的值(小epsilon),而不是从第一个到最后一个总结数组中的值。这可能不会显示在一个简单的cout上,其中浮点值被截断为特定的固定小数位,但是如果您尝试在两个不同的求和上使用==操作而不合并某些epsilon值,结果可能仍然是错误的。