C++ C++;向量值之和(递归)
以下内容可用于对向量中的整数求和:C++ C++;向量值之和(递归),c++,recursion,vector,C++,Recursion,Vector,以下内容可用于对向量中的整数求和: #include <iostream> #include <vector> int arraySum(std::vector<int> vec, std::vector<int>::iterator start, std::vector<int>::iterator finish) { if (vec.size()==1) { return vec[0]; }
#include <iostream>
#include <vector>
int arraySum(std::vector<int> vec, std::vector<int>::iterator start, std::vector<int>::iterator finish)
{
if (vec.size()==1)
{
return vec[0];
}
else
{
if (start!=finish)
{
return *start + arraySum(vec, start+1, finish);
}
}
}
int main()
{
std::vector<int> intVec(5);
intVec[0] = 1;
intVec[1] = 2;
intVec[2] = 3;
intVec[3] = 4;
intVec[4] = 5;
std::cout << arraySum(intVec, intVec.begin(), intVec.end());
return 0;
}
#包括
#包括
intarraysum(std::vector vec,std::vector::iterator start,std::vector::iterator finish)
{
如果(向量大小()==1)
{
返回向量[0];
}
其他的
{
如果(开始!=完成)
{
返回*start+arraySum(vec,start+1,finish);
}
}
}
int main()
{
std::vector intVec(5);
intVec[0]=1;
intVec[1]=2;
intVec[2]=3;
intVec[3]=4;
intVec[4]=5;
std::cout您没有为递归中的所有路径返回值
如果一个函数应该返回一个值,比如在您的例子中的int
,那么您需要为函数中的所有条件返回一个值。在start==finish
的例子中,您缺少一个值
在这种情况下,函数可能返回一个垃圾值,您将其添加到求和中
只需在函数末尾添加return0;
就可以解决这个问题,因为只有在start==finish
的情况下,您才能到达该阶段
当警告出现时,诊断警告很重要,它们经常会在代码中显示问题或bug。如果您没有看到任何警告标志,我强烈建议您向编译器添加警告标志,以便更容易捕获此类bug,我将添加至少-Wall-Wextra
您没有为递归中的所有路径返回值
如果一个函数应该返回一个值,比如在您的例子中的int
,那么您需要为函数中的所有条件返回一个值。在start==finish
的例子中,您缺少一个值
在这种情况下,函数可能返回一个垃圾值,您将其添加到求和中
只需在函数末尾添加return0;
就可以解决这个问题,因为只有在start==finish
的情况下,您才能到达该阶段
诊断出现的警告非常重要,它们经常会显示代码中的问题或bug。如果您没有看到任何警告标志,我强烈建议您向编译器添加警告标志,以便更容易捕获此类bug,我将在提供的答案/注释的帮助下,至少添加-Wall-Wextra
,在功能如下。我将其发布在此处,以方便将来阅读此问题:
int arraySum(std::vector<int>::iterator start, std::vector<int>::iterator finish, int sum)
{
if (start != finish)
{
sum += *start;
return arraySum(++start, finish, sum);
}
return sum;
}
intarraysum(std::vector::iterator start,std::vector::iterator finish,int sum)
{
如果(开始!=完成)
{
总和+=*开始;
返回数组sum(++开始、结束、和);
}
回报金额;
}
在提供的答案/注释的帮助下,函数中的代码如下。我将其发布在此处,以方便将来阅读此问题:
int arraySum(std::vector<int>::iterator start, std::vector<int>::iterator finish, int sum)
{
if (start != finish)
{
sum += *start;
return arraySum(++start, finish, sum);
}
return sum;
}
intarraysum(std::vector::iterator start,std::vector::iterator finish,int sum)
{
如果(开始!=完成)
{
总和+=*开始;
返回数组sum(++开始、结束、和);
}
回报金额;
}
如果已经传递了intVec.begin()
和intVec.end()
则不需要传递向量,而且向量的大小仍然保持不变,因此它本身应该是一个提示,即使用向量作为参数,测试它的size()
并期望它改变,这是错误的。您确实意识到,由于所有参数都是按值传递的,所以每次递归调用都会创建一个全新的向量副本,对吗?迭代器是在main
中创建的第一个原始向量?您希望通过这样的努力实现什么?P.S.有任何值得使用的编译器吗它的盐会发出一个警告消息,它可以准确地解释你的bug是什么。你从编译器那里得到警告消息吗?如果没有,找到一个更好的C++编译器。如果你这样做了,这将是一个很好的生活经验,即使它最终还是编译代码,也不会忽视编译器警告。o迭代器,您可以通过std::distance(start,finish)
(requires#include
)获得迭代器范围的大小,因此不需要vec.size()
。或者对于随机访问迭代器,如此处,finish-start
也会提供距离。请提供编译器输出。如果已经传递了intVec.begin()和intVec.end(),则无需传递向量
并且向量的大小仍然保持不变,因此它本身应该是一个提示,使用向量作为参数,测试它的size()
并期望它改变,这是错误的。您确实意识到,由于所有参数都是按值传递的,所以每次递归调用都会创建一个全新的向量副本,对吗?迭代器是在main
中创建的第一个原始向量?您希望通过这样的努力实现什么?P.S.有任何值得使用的编译器吗它的盐会发出一个警告消息,它可以准确地解释你的bug是什么。你从编译器那里得到警告消息吗?如果没有,找到一个更好的C++编译器。如果你这样做了,这将是一个很好的生活经验,即使它最终还是编译代码,也不会忽视编译器警告。o迭代器,您可以通过std::distance(start,finish)
(requires#include
)获得迭代器范围的大小,因此不需要vec.size()
。或者对于随机访问迭代器,如此处,完成-开始
也会提供距离。请提供编译器输出。虽然添加-Wall-Wextra
的建议肯定是一个非常好的建议,但所有三个主要编译器(clang、gcc、msvc)已经针对此特定问题发出警告,即使没有任何标志,至少是最新版本。OP使用的是旧的编译器版本,或者忽略了警告。8.1版之前的GCC似乎是例外。虽然建议添加-Wall-Wextra
cer