2013-03-12 72 views
0

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

回答

1

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

+0

谢谢,乔治,问题修复。 – T4000 2013-03-12 13:34:40

4

那么,因为没有元素的总和为零,而不是减1。

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一起,只是在一个slighlty不同的方式。这也是为什么没有元素的产品是一个。

0

尽管这并不能解释输出中的大差异,但要记住的另一件事是当您通过返回-10来解决问题时的操作排序... IEEE浮点运算不是必须是可交换的,所以确保当你正在做递归与迭代方法时,按照完全相同的顺序加上数字,否则你的输出可能仍然会有一些ε值的差异。

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

+0

只要所有的加数都是相同的符号,它就很少有意义。但是如果你绝对必须非常非常准确地进行总结(通常情况下,无联系的功能很快就能准确地计算出准确度),那么存在着Kahan算法,它具有不变的误差。或者两两相加,它具有'O(log n)'错误。 – 2013-03-12 19:22:11