将int添加到long

时间:2017-03-17 19:48:47

标签: c++ recursion vector long-integer

我正在创建一个递归公式来添加IFERROR中的所有元素。我遇到的问题是我的结果没有添加到vector结果中,因此它始终返回vector。我已经尝试0将其变为static_cast,但我还是无法弄明白。这是我的代码:

int

我正在调用这样的函数:

long vectorSum(const std::vector<int>& data, unsigned int position) {
int ret = 0;
if(position == data.size()-1) {
      return ret;
  } else {
      ret += data[position];
      return vectorSum(data, position+1);
  }
}

3 个答案:

答案 0 :(得分:2)

这是不正确的:

ret += data[position];
return vectorSum(data, position+1);

ret(+= data[position])的新值未在任何地方使用或传回给调用者。

记住:retvectorSum()的每次调用都是严格本地的。它不存在于vectorSum()之外;每次调用vectorSum()时都会将其设置为“0”。

答案 1 :(得分:0)

通常,一个会将添加到递归调用的值中。你不是那样做的。在您的代码中,它将继续使用修改后的position进行调用,直到它达到终止条件,然后return 0;一直返回到调用者。

long vectorSum(const std::vector<int>& data, unsigned int position) {
    int ret = 0;
    if(position == data.size()-1) {
        return ret;
    } else {
        ret += data[position]; //this line has no affect on the result!

        return vectorSum(data, position+1); //you don't accumulate anything
                                            //this will always return 0
    }
}

相反,您希望添加当前值加上递归调用的值:

long vectorSum(const std::vector<int>& data, unsigned int position) {
    if(position == data.size()-1) {
        //terminating condition, return 0
        return 0;
    } else {
        //add current value plus value from processing the rest of the list
        return data[position] + vectorSum(data, position+1);
    }
}

作为旁注:递归是一个很好的工具,但通过将其应用于已经拥有更好,更优雅的解决方案的问题,它很容易被滥用。对于这个,像std::accumulate这样的东西可能是最自然的&#34; C ++解决方案。

答案 2 :(得分:0)

long vectorSum(const std::vector<int>& data, unsigned int position) { 
if(position == data.size())
   return 0; 
else
    return data[position]+vectorSum(data, position+1);
}

然后将其称为 int sum = vectorSum(data,0);