在矢量中推回后,数字发生了变化
number changed after push back in vector
这是我的代码(不要介意法语部分,本质上是代码本身):
#include <iostream>
#include <vector>
using namespace std;
double SommeRecursive(vector <double> tableau) {
int i = tableau.size();
if (i > 1) {
vector <double> clone = tableau;
int dernier = clone[i-1];
clone.pop_back();
return dernier + SommeRecursive(clone);
}
}
int main(int argc, char** argv) {
vector <double> tableau;
double nombre;
cout << "Nombre 1 : ";
cin >> nombre;
tableau.push_back(nombre);
cout << "Nombre 2 : ";
cin >> nombre;
tableau.push_back(nombre);
cout << "Nombre 3 : ";
cin >> nombre;
tableau.push_back(nombre);
cout << "Résultat : " << SommeRecursive(tableau) << endl;
return 0;
}
我在使用后测试我的代码
gcc -std=c++14 -o main main.cpp && ./main
如果我输入 3.33、3.33 和 3.33 这样的数字,我会得到结果 9.33 而不是 9.99。知道为什么吗?
这一行是你的问题:
int dernier = clone[i-1];
您正在转换为整数。因此,当您的递归函数计算时,它将执行以下操作:
(int) 3.33 + (int) 3.33 + 3.33 = 3 + 3 + 3.33 = 9.33
另外,我怀疑您的递归函数应该是:
if (i > 1) {
...
double dernier = clone[i-1];
...
} else {
return tableau[0]; // This is your base condition.
}
这是一个活生生的例子。
您的程序存在几个问题:
-
您正在截断
double
行中的int
:int dernier = clone[i-1];
-
当输入为空向量时,函数
SommeRecursive
没有return
语句。因此,您的程序表现出未定义的行为。
将其更改为:
double SommeRecursive(vector <double> tableau) {
int i = tableau.size();
if (i > 0) {
vector <double> clone = tableau;
double back = clone.back();
clone.pop_back();
return back + SommeRecursive(clone);
}
return 0.0;
}
进一步优化了避免创建输入向量副本的函数:
double SommeRecursive(std::vector<double>::const_iterator begin,
std::vector<double>::const_iterator end)
{
if ( begin == end )
{
return 0.0;
}
return *begin + SommeRecursive(begin+1, end);
}
double SommeRecursive(std::vector<double> const& tableau)
{
return SommeRecursive(tableau.begin(), tableau.end());
}
在你的 sommeRecursive 方法中,你会得到一个 int 变量中的第 i-1 个值,而不是双精度值,所以它被向下舍入(即 3 + 3 + 3.33)
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- libstdc++的make_shared布局在gcc 4.x和gcc 6.x之间是否发生了变化?
- 我是否能够确定在部署一个程序后发生了什么,我在数组末尾写入?
- 为什么我的 int 在 C++ 程序中间发生了变化?
- 这个阶乘程序内部发生了什么?
- C++ - *(int**) 地址?这里发生了什么?
- C++用用户输入在循环中填充 char 数组:输入整个字符串时到底发生了什么?
- 为什么 rand() 给我的数字超出了我定义的间隔?(昨天工作正常)
- 在使用VS2010构建ACE和TAO(CORBA)时发生了许多错误
- 为什么在波纹管程序中发生了从字符串常量到'char*'的警告已弃用的转换
- 在矢量中推回后,数字发生了变化
- 为什么字符串变量的sizeof()总是返回相同的数字,即使内容发生了变化