2013-03-12 116 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