我正在创建一个递归公式来添加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);
}
}
答案 0 :(得分:2)
这是不正确的:
ret += data[position];
return vectorSum(data, position+1);
ret(+= data[position]
)的新值未在任何地方使用或传回给调用者。
记住:ret
对vectorSum()
的每次调用都是严格本地的。它不存在于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);