2011-09-21 109 views
2

我在使用數組進行遞歸時有點困惑,任何人都可以糾正我的錯誤嗎?計算雙數組中所有元素的總和

新的更新,基於問題需要一些行不能編輯

double sum_of_array(double x[],int size) 
{ 


    static double sum; <---can be edit 

    int index = 0; <--can be edit 

    if(index<size){ 

     return sum + sum_of_array(x,size-1); <--can be edit 

    } 

    else { 
     something ; <--can be edit 
     return sum; <--can be edit 

    } 
} 

int main(void){ 

    double x[] = {4.5,5.0,6.8}; 

    double y[] = {4.7,3.4,2.5,5.2}; 

    cout<<"Sum X = "<<sum_of_array(x,3)<<endl; 

    cout<<"Sum Y = "<<sum_of_array(y,4)<<endl; 

    return 0; 
} 

輸出:

Sum of the element in X[]=15.3 

Sum of the element in Y[]= 15.8 
+1

BTW:'4.5 + 5.0 + 6.8 == 16.3!= 15.3' – quasiverse

+0

投票結束爲「爲什麼不工作」。 –

回答

1

你從來沒有真正在x[]和​​添加值sum,此外,index總是等於0。你應該把它作爲另一個參數的函數:

double sum_of_array(double x[], int size, int index) 
{ 
    if(index<size){ 
     return x[index] + sum_of_array(x, size, index+1); 
    } 
    else { 
     return 0; 
    } 
} 

你實際上並不需要sum變量。

+0

但請注意'index'始終等於0. –

+0

@NathanFellman我剛剛意識到這一點!編輯。 – quasiverse

+0

我不能用你的方法得到我想要的輸出>< –

0

錯誤是你沒有初始化靜態變量之和。

+0

我以爲我做過? –

+0

您的代碼沒有初始化總和,這取決於您運行代碼的平臺和配置,但通常您的代碼會得到隨機答案。 – Yuan

0

我這個啓動:

return sum + sum_of_array(x,size-1); 

你不是應該返回:

return x[size] + sum_of_array(x,size-1);  

除此之外,你應該找到一種方法,初始調用之間設爲sum爲零函數,因爲否則它將累積總和全部您試圖總結的數組。

問題是,你永遠不會初始化sum,所以它有一些垃圾。

當一個簡單的for循環可以做到這一點時,誰的想法是使用遞歸?這是功課嗎?

2

有這個代碼相當長的一段錯誤:

  • 首先,一定數額似乎是無用的。什麼曾用於?
  • 其次,你永遠不會在你的函數中獲取x的內容。
+0

以及!比通過例子顯示更好:-) –

+0

我試圖添加x像sum_of_array(x,索引),但它似乎沒有工作 –

+0

問題更新,內森先生可以幫助? –

6

你正在試圖製造一些極其過度工程的東西。你需要兩件事 - 邊緣案例(遞歸截斷)和一般案例(遞歸下降)。在你的情況下,邊界情況是「數組大小爲零」,一般情況是「抓住第一個元素並將其餘數組傳遞給遞歸」。

這可能是這樣的:

double sum_of_array(double x[], int size) 
{ 
    if(size == 0) { //this is the edge case 
     return 0; 
    } 

    // here you grab the first element and pass the rest of array into a recursive call 
    return x[0] + sum_of_array(x + 1, size - 1); 
} 
+0

這個if語句不能改變,必須是if(index

+0

@low chee mun:你不需要'index'。 – sharptooth

+0

通過使用尾遞歸可以提高效率:添加第三個參數'value',如果'size'爲零,並且最後一行變爲'return sum_of_array(x + 1,size - 1,value + x [0])'。 – Idelic

1

的問題是,你正在使用一個靜態變量sum代替x[size - 1]。顯示如何解決這個問題在這個時候是多餘的(7個答案已經這樣做)。但是,這可以通過內置的C++功能在一行中完成:

#include <algorithm> 
double sum_of_array(double x[], int size) 
{ 
    return std::accumulate(x, x + size, 0.); 
} 
2

遞歸函數的邏輯錯誤。你永遠不會讀取數組的內容。我很驚訝,你有任何有意義的輸出。

您需要重新考慮執行此添加的遞歸定義。

基本情況:
空數組的總和爲0.
即,sum_of_array(x, 0) == 0.

1元素數組的總和就是元素的值。
sum_of_array(x, 1) == x[0]

遞歸情況下:
的n個元素的數組的總和爲第n個元素的總和與第一n-1元素的總和。
即,sum_of_array(x, n) == x[n-1] + sum_of_array(x, n-1)

找出如何在你的函數中編碼這個邏輯。

+0

Aww堅果,大家只是給了代碼。 :| –

+0

嗯,謝謝你的建議,我在我的路上 –

0
double sum_of_array(double x[],int size) 
{ 
    size = size - 1; 
    if(size < 0){ 
     return 0; 
    } 
    return x[size] + sum_of_array(x, size); 
} 
+0

基於所需的問題,我不假設編輯如果語句,它必須是如果(索引<大小) –

0

好的話應該是這樣的:

double sum_of_array(double x[],int index) 
{ 
    int size = sizeof(x)/sizeof(x[0]); 
    if(index<size){ 
     return x[index] + sum_of_array(x, index + 1); 
    } 
    return 0; 

} 

然後調用

sum_of_array(x,0); 

你的IE總是0第一時間致電作爲索引

+0

輸出: int大小陰影參數和總和x和y都是零,這不是我想要的 –

0

好了最後一次嘗試:

double sum_of_array(double x[], int index, int size) 
{ 
    if(index < size){ 
     return x[index] + sum_of_array(x, index + 1, size); 
    } 
    else { 
     return 0; 
    } 

} 

然後

cout<<"Sum X = "<<sum_of_array(x,0,3)<<endl; 
+0

函數變量無法更改,反正謝謝 –

0

這是多麼我已經做到了:

double sum_of_array(double x[], int size) 
{ 
    if(size == 0){ 
     return 0; 
    } 

    else{ 
     return x[--size] + sum_of_array(x, size); 
    } 

} 
0

我希望我仍然可以附和我的答案。排除我的最新答案是2011年。

這是計算數組中所有元素之和的又一個解決方案。

double array_sum(double *p_array, int idx_low, int idx_high){ 
    if(idx_low == idx_high) 
     return p_array[idx_low]; 
    int idx_mid=idx_low+(idx_high-idx_low)/2; 
    return array_sum(p_array,idx_low,idx_mid)+array_sum(idx_mid+1, idx_high); 
} 

該算法的分析將運行時間爲O(n*log(n))。 但是,你應該明智地採取一點鹽,採取這種說法。