向量递归均值
Vector recursive mean
我编写了这个程序,它使用递归函数计算向量中元素的和和均值。用户应该输入尽可能多的数字,然后在完成后按"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]
。
相关文章:
- 以C++递归方式查找向量中的最大值
- 尾递归,带有通过引用传递的向量
- 返回向量 C++ 上的递归
- 递归回文检查,不使用向量、大小或其他参数
- n维向量的递归可变参数模板函数
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- 我们应该全局声明一个向量还是在递归函数中传递它以减少内存使用
- 递归向量中的最小正数
- 使用递归C++向量元素的总和
- 如何在递归函数中打印向量
- 递归结构的向量有内存问题
- 递归函数,返回向量中所有元素的总和
- 使用递归的C 在向量中找到非齐射的数量
- boost::variant:具有递归向量类型的奇怪行为
- 在递归函数中收集cout或输出为向量
- 从向量中删除重复项,递归 c++
- 使用递归将元素添加到向量中
- 迭代和递归地查找向量中是否存在元素
- 递归对向量进行排序的最简单方法