我正在尝试以下方法来获取向量中所有元素的总和。根据调试器,执行if语句的内部但结果始终为0.
double Problem1::recSum(std::vector<double> list) //public
{
return recSum(list.begin(), list.end(), 0);
}
double Problem1::recSum(std::vector<double>::iterator begin, std::vector<double>::iterator end, double sum) // private
{
if (begin != end)
{
sum += *begin;
recSum(++begin, end, sum);
}
return sum;
}
我知道矢量被正确填充,因为我之前迭代地计算了相同的和。如果我误解了递归的错误,请提供一些有关此事的材料。
答案 0 :(得分:2)
因为您需要返回递归结果:
double Problem1::recSum(std::vector<double>::iterator begin, std::vector<double>::iterator end, double sum) // private
{
if (begin != end)
{
sum += *begin;
return recSum(++begin, end, sum);
}
return sum;
}
作为备注,您的recSum
应该const std::vector<double>& list
以避免复制您的向量,显然,迭代元素比使用递归更好。
如果你想使用递归,那么用这种方式编写它可能更好:
double Problem1::recSum(std::vector<double>::iterator begin, std::vector<double>::iterator end) // private
{
return (begin != end) ? *begin + recSum(begin+1, end) : 0.0;
}
另一个选择是使用std::accumulate:
#include <numeric>
double Problem1::recSum(const std::vector<double>& list) //public
{
return std::accumulate(list.begin(), list.end(), 0);
}
在你的情况下,这很明显,因为你的recSum
没有任何副作用,并且因为你没有使用它的返回值而实际上不会有所作为。因此你的函数总是有0,因为你的向量的第一个元素是0.通常,当你编写一些算法时,你应该尝试使用简单的输入,例如空向量,带有一个元素的向量和带有向量的向量来执行代码。 2个元素。使用0和1元素它将起作用,但是使用2个元素将返回错误的结果。想象一下你有两个双精度[0.0,1.0]的向量,在第一次迭代时你的总和变为0 + 0.0,你将用你的迭代器递归调用你的函数指向余数或你的序列:[1.0],第二次迭代将正确计算总和为1.0,但结果不会在任何地方使用。