在矢量中推回后,数字发生了变化

number changed after push back in vector

本文关键字:数字 发生了 变化      更新时间:2023-10-16

这是我的代码(不要介意法语部分,本质上是代码本身):

#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.
}

这是一个活生生的例子。

您的程序存在几个问题:

  1. 您正在截断double行中的int

    int dernier = clone[i-1];
    
  2. 当输入为空向量时,函数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)