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

calculate the sum of all element in a double array

本文关键字:元素 双精度 数组 计算      更新时间:2023-10-16

我在使用数组做递归有点困惑,有人能纠正我的错误吗?

新更新,根据问题要求部分行不能编辑

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

你在尝试制作一些过度设计的东西。您需要两样东西—边缘情况(递归截止)和一般情况(递归下降)。在你的例子中,边缘情况是"数组大小为零",一般情况是"获取第一个元素并将数组的其余部分递归"。

可以是这样的:

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

这段代码中有相当多的错误:

  • 首先,常数和似乎是无用的。它曾经被用来做什么?
  • 第二,你永远不要在你的函数中使用x的内容。

你的递归函数的逻辑是错误的。实际上,您从未读取数组的内容。我很惊讶你从中得到了任何有意义的输出。

你需要重新考虑递归定义来执行这个加法。

基本情况(s):
空数组的和为0.
sum_of_array(x, 0) == 0.

单元素数组的和是该元素的值。
sum_of_array(x, 1) == x[0]

递归的例子:
n元素数组的和是第n个元素和前4个n-1元素的和。
sum_of_array(x, n) == x[n-1] + sum_of_array(x, n-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变量

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

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

未初始化静态变量sum

我想从这个开始:

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

你不应该回来吗?

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

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

问题是,你从来没有初始化sum,所以它有一些垃圾。

当一个简单的for循环就能解决问题时,谁的主意是使用递归 ?这是家庭作业吗?
double sum_of_array(double x[],int size)
{
    size = size - 1;
    if(size < 0){
        return 0; 
    }
    return x[size] + sum_of_array(x, size);
}

那么应该是这样的:

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作为索引

最后一次尝试:

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;

我是这样做的:

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

我希望我还能插话。最近的答案(不包括我的)是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))的运行时。但是,您最好对这句话持怀疑态度。