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

时间:2016-02-03 22:26:04

标签: c++ function recursion 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。知道为什么吗?

3 个答案:

答案 0 :(得分:4)

这一行是你的问题:

graphRec = {links: graph.links.slice(), nodes: graph.nodes.slice()}

您正在转换为int。因此,当您的递归函数计算时,它将执行此操作:

int dernier = clone[i-1];

我还怀疑你的递归函数应该是:

(int) 3.33 + (int) 3.33 + 3.33 = 3 + 3 + 3.33 = 9.33

Here is a live example.

答案 1 :(得分:2)

您的程序遇到了几个问题:

  1. 您正在截断if (i > 1) { ... double dernier = clone[i-1]; ... } else { return tableau[0]; // This is your base condition. } double行:

    int
  2. 当输入为空向量时,函数int dernier = clone[i-1]; 没有SommeRecursive语句。因此,您的程序表现出不确定的行为。

  3. 将其更改为:

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

答案 2 :(得分:1)

在你的sommeRecursive方法中,你得到一个int变量的i-1th值而不是double,所以它向下舍入(即3 + 3 + 3.33)