我很困惑如何让这个函数添加向量中的最后一个元素。我无法修改函数参数。
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;
}
答案 0 :(得分:3)
当您在data.size() -1
停留时,您为vectorSum(data, data.size()-1)
返回0而不计算最后一个条目的值
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;
}
答案 1 :(得分:1)
当您查看最后一个元素时,您会遇到以下情况:
if (position == data.size()-1)
此时,position
为4
,data.size()
为5
。所以条件匹配,递归结束。
您需要将==
更改为>
,或删除-1
答案 2 :(得分:1)
递归函数总是有两个部分:停止条件和递归。这里一个简单的停止条件是:当向量中没有元素时,总和为0.递归是:非空向量的元素之和是其第一个元素的值加上剩余元素的总和。在代码中,停止条件如下所示:
cert1Bool
在代码中,递归看起来像这样:
if (position == data.size())
return 0;
稍微复杂的停止条件是:当向量中只有一个元素时,sum是该元素的值。在代码中:
else
return data[position] + vectorSum(data, position + 1);
与第一个相比,它具有更少的递归级别。但它对空载体不起作用。所以选择你的毒药。
原始代码的问题在于其停止条件未正确实施。它混合了这两种停止条件。