递归函数,返回向量中所有元素的总和
Recursive function that returns a sum of all elements in a vector
我对如何让这个函数在向量中添加最后一个元素感到困惑。我无法修改函数参数。
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
4
,data.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];
与第一个相比,这减少了一个递归级别。但它不适用于空向量。所以选择你的毒药。
原始代码的问题在于其停止条件未正确实现。它混合了这两种停止条件。
相关文章:
- lower_bound()返回最后一个元素
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 这个返回元素位置的基于循环的函数有什么问题?
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 反转后不返回最后一个元素
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 第 i 个元素返回 i 的函数数组
- 将新元素添加到列表中,并返回对该元素的引用?
- C++ 将向量中出现 n 次的所有元素作为向量返回
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?
- 返回向量元素的 l 值的正确方法是什么?
- C++函数返回两个 char 数组的相同索引元素
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 函数返回包含输入容器的特定元素的容器
- 在数组中查找元素,如果找到则返回Find,否则返回not Find
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 返回纯虚拟基类的向量的元素
- 比较 C++ 中的两个数组,并根据元素的匹配或不匹配返回值
- 在位置 i 处插入元素,并根据 i 第一个元素返回信息