向量递归均值

Vector recursive mean

本文关键字:递归 向量      更新时间:2023-10-16

我编写了这个程序,它使用递归函数计算向量中元素的和和均值。用户应该输入尽可能多的数字,然后在完成后按"0"。我忽略了最后一个元素,也就是0。然而,求和函数仍然有问题,因为它忽略了向量中的第一个元素,因此平均值也不正确。下面是代码:

    int main(void){
     vector <int> series;
     int  n;
     unsigned int nr_elem;
  cout << "Type as many numbers as you want and press 0 when you are finished:";
      do{
       cin >> n;
       series.push_back(n);
        } while (n);
  nr_elem = series.size()-1;
  cout << "nr_elem="<< nr_elem;
  cout << "n The sum of the elements in the series is: " << sum(series, nr_elem);
  cout << "n The average of the elements is: " << average(series, nr_elem);
  return 0;
       }
   int sum(vector<int> &series, int n){
    if (n == 0)
      return 0;
    else
      return series.at(n) + sum(series, n - 1);
    }
    double average(vector<int> &series, int n){
     if (n == 0)
     return 0;
 else
     return (series.at(n) + sum(series, n - 1)) / n;
    }

对于输入值:10,20,50,0,我得到nr_elem=3

                               The sum of the elements is: 70
                               The mean is: 23`

这是我第二次尝试矢量,因此,任何解释和额外的更正将是最感激的。

向量的大小由size()函数给出,它返回向量中元素的确切数量,但索引从0开始。

没有计算sum函数

中的0元素(不是插入的最后一项,是vector的第一项!)
int sum(vector<int> &series, int n){
    if (n == 0) // This is the problem, 0 isn't the last element, is the first element!
      return 0;
    else
      return series.at(n) + sum(series, n - 1);
    }

要解决(最小侵入性),更改

if (n == 0)

变成

if (n == -1)

编辑:如果你想返回一个双精度值,你也需要处理双精度值。如果你用整数(没有十进制数字)做数学运算,你会得到一个整数结果(没有十进制数字)。所以你丢失了你的十进制数字

另一个"丑陋"的解决方案是将整型强制转换为双精度,并在所有值都是双精度时进行数学运算

double average(vector<int> &series, int n){
     if (n == -1)
     return 0;
 else
     return (static_cast<double>(series.at(n)) + static_cast<double>(sum(series, n - 1))) / static_cast<double>(n);
    }

change

if (n == 0)
  return 0;  

if (n == -1)
  return 0;

数组(矢量)索引从0 ,1 , .... , n-1开始,您在索引0上返回0,而不是vector[0]