使用递归的C ++矢量元素总和

时间:2017-05-15 22:52:11

标签: c++ recursion vector iterator

我正在尝试以下方法来获取向量中所有元素的总和。根据调试器,执行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;
}

我知道矢量被正确填充,因为我之前迭代地计算了相同的和。如果我误解了递归的错误,请提供一些有关此事的材料。

1 个答案:

答案 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,但结果不会在任何地方使用。