矢量递归均值

时间:2014-03-16 14:25:24

标签: c++ vector

我编写了这个程序,使用递归函数计算向量中元素的总和和平均值。用户应该输入他想要的数量,然后在完成时按“0”。我忽略了最后一个“0”的元素。但是,sum函数仍然存在一些问题,因为它忽略了向量中的第一个元素,因此它的结果也是错误的。这是代码:

    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`

这是我对载体的第二次试验,因此,任何解释和额外的修正都将非常受欢迎。

2 个答案:

答案 0 :(得分:1)

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

你没有计算和函数中的0(不是你插入的终端项,向量的第一项!)元素

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值,则还需要处理double值。如果你用整数(没有十进制数字)进行数学计算,你将得到一个整数结果(没有十进制数字)。所以你丢失了十进制数字。

另一个“丑陋”的解决方案是将整数强制转换成双打并在所有内容都加倍时进行数学运算

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

答案 1 :(得分:0)

更改

if (n == 0)
  return 0;  

if (n == -1)
  return 0;

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