Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向量值之和(递归)_C++_Recursion_Vector - Fatal编程技术网

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