递归函数,返回向量中所有元素的总和

Recursive function that returns a sum of all elements in a vector

本文关键字:元素 返回 向量 递归函数      更新时间:2023-10-16

我对如何让这个函数在向量中添加最后一个元素感到困惑。我无法修改函数参数。

long vectorSum(const std::vector<int>& data, unsigned int position)
{
   if (position == data.size()-1)
   {
      return 0;
   }
   else 
   {
      return (vectorSum(data, position+1) + data[position]);
   }
}
int main()
{
    //vectorSum test
   std::vector<int> data = { 1,2,3,4,5};
   unsigned int pos = 0;
   std::cout << "expected: 15, " << "actual: " << vectorSum(data, pos) << std::endl;
}

当您在 data.size() -1 处停止时,您将返回 0 表示vectorSum(data, data.size()-1)而不计算最后一个条目的值

long vectorSum(const std::vector<int>& data, unsigned int position)
{
   if (position == data.size()) // You were stopping early
   {
      return 0;
   }
   else 
   {
      return (vectorSum(data, position+1) + data[position]);
   }
}
int main()
{
    //vectorSum test
   std::vector<int> data = { 1,2,3,4,5};
   unsigned int pos = 0;
   std::cout << "expected: 15, " << "actual: " << vectorSum(data, pos) << std::endl;
}

当您查看最后一个元素时,您有以下条件:

if (position == data.size()-1)

此时,position 4data.size() 5。因此,条件匹配并且递归结束。

您需要将==更改为 > ,或删除-1

递归函数总是有两个部分:停止条件和递归。这里一个简单的停止条件是:当向量中没有元素时,总和为 0。递归是:非空向量的元素之和是其第一个元素的值加上其余元素的总和。在代码中,停止条件如下所示:

if (position == data.size())
    return 0;

在代码中,递归如下所示:

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

稍微复杂的停止条件是:当向量中只有一个元素时,总和就是该元素的值。在代码中:

if ( position == data.size() - 1)
    return data[position];

与第一个相比,这减少了一个递归级别。但它不适用于空向量。所以选择你的毒药。

原始代码的问题在于其停止条件未正确实现。它混合了这两种停止条件。