2011-09-21 79 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))。 但是,你应该明智地采取一点盐,采取这种说法。