计算双数组中所有元素的总和

时间:2011-09-21 06:35:45

标签: c++ recursion

我在使用数组进行递归时有点困惑,任何人都可以纠正我的错误吗?

新的更新,根据问题需要一些行无法编辑

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

12 个答案:

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

答案 1 :(得分:2)

此代码中存在一些错误:

  • 首先,常数总和似乎毫无用处。曾经用过什么?
  • 其次,你永远不会在你的函数中获取x的内容。

答案 2 :(得分: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)

弄清楚如何在你的函数中编码这个逻辑。

答案 3 :(得分:1)

您实际上从未将x[]y[]中的值添加到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变量。

答案 4 :(得分:1)

问题是您使用的是静态变量sum而不是x[size - 1]。目前显示如何解决这个问题是多余的(7个答案已经做到了这一点)。但是,这可以在内置c ++功能的一行中完成:

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

答案 5 :(得分:0)

错误是您没有初始化静态变量sum。

答案 6 :(得分:0)

我从这开始:

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

你不应该回来:

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

除此之外,你应该找到一种方法在初始调用函数之间将sum设置为零,否则它将累积所有总和你试图总结的数组

关键是,你永远不会初始化sum,所以它有一些垃圾。

当一个简单的for循环可以解决问题时,使用递归是什么想法呢?这是家庭作业吗?

答案 7 :(得分: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);
}

答案 8 :(得分: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作为索引

答案 9 :(得分: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;

答案 10 :(得分:0)

我就是这样做的:

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

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

}

答案 11 :(得分: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))的运行时间。 但是,你明智地用一点点盐来表达这句话。