C++递归不返回预期值

C++递归不返回预期值,c++,return,C++,Return,这是我的密码。我希望它返回5,因为增量为1。问题是如果x>=5,那么如何将值返回到主函数?一个函数中应该只有一个返回 int addup(int x) { if (x < 5) { std::cout<< x++; addup(x); } else return x; } int main() { using namespace std; int x = 0; cout <<

这是我的密码。我希望它返回5,因为增量为1。问题是如果x>=5,那么如何将值返回到主函数?一个函数中应该只有一个返回

int addup(int x)
{
    if (x < 5)
    {
        std::cout<< x++;
        addup(x);
    }
    else return x;
}

int main()
{
    using namespace std;
    int x = 0;
    cout << "And x is:" << addup(x) << endl;

    cin.clear();
    cin.ignore(32767, '\n'); 
    cin.get(); 
    return 0;
}
您缺少递归调用的返回

替换

addup(x);

如果在该行中没有返回,则函数在结尾处会掉下来,并且会受到未定义行为的影响

一个好的编译器会警告您if块中缺少return语句。当使用-Wall编译时,我从g++得到以下警告:

socc.cc: In function ‘int addup(int)’:
socc.cc:11:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
您缺少递归调用的返回

替换

addup(x);

如果在该行中没有返回,则函数在结尾处会掉下来,并且会受到未定义行为的影响

一个好的编译器会警告您if块中缺少return语句。当使用-Wall编译时,我从g++得到以下警告:

socc.cc: In function ‘int addup(int)’:
socc.cc:11:1: warning: control reaches end of non-void function [-Wreturn-type]
 }

在递归过程中,应始终返回一个值:

int addup(int x)
{
    if (x < 5)
    {
        std::cout << x++;
        return addup(x);
    }
    else return x;
}

在某些语言(如Java)中,原始代码可能会导致编译器错误,因为它并不总是返回值。在C++编译器中,显然允许使用,但是IF的两个流都应该返回一个值作为良好的实践。

< P>在递归过程中,你应该总是返回一个值:

int addup(int x)
{
    if (x < 5)
    {
        std::cout << x++;
        return addup(x);
    }
    else return x;
}

在某些语言(如Java)中,原始代码可能会导致编译器错误,因为它并不总是返回值。在C++编译器中,显然允许使用,但是IF的两个流都应该返回一个值作为好的实践。

< P>,为了理解递归中有这种返回的原因,可以想到函数调用/堆栈框架的基础:

我们需要return语句将值传递回当前函数调用帧的直接调用方。在递归的情况下,这个直接调用方可以是同一个函数的另一个调用

如果调用的函数的返回值(无论是递归函数还是普通函数)未被使用,则该返回值要么被丢弃,要么在许多语言中是错误的。在某些情况下,最后一次函数调用的返回值会自动重新用作当前函数调用的返回值。这就是为什么您可能会看到未定义的行为,并且无法阻止这种情况,一些智能编译器确实会对此发出警告

递归调用应具有:

基本情况:我们有解决方案和返回值的一些条件。可以有多个基本情况

算法或逻辑更接近我们的基本情况,即将原始问题分解为更简单的问题

递归调用,将较简单的问题传递回函数

int addup(int x)
{
    if (x < 5)
    {
        std::cout<< x++;
        addup(x);
    }
    else return x;
}

int main()
{
    using namespace std;
    int x = 0;
    cout << "And x is:" << addup(x) << endl;

    cin.clear();
    cin.ignore(32767, '\n'); 
    cin.get(); 
    return 0;
}
因此,在本例中,基本情况是x>=5,接近基本情况的逻辑是x++,递归调用与参数x相加。但您不在此处保存返回值,因为返回值可能会被丢弃或丢失,因此可能会导致进一步的问题,因此应按照以下方式妥善处理: 返回addupx


我希望它现在有意义。

好吧,要理解递归返回的原因,您可以考虑函数调用/堆栈框架的基础知识:

我们需要return语句将值传递回当前函数调用帧的直接调用方。在递归的情况下,这个直接调用方可以是同一个函数的另一个调用

如果调用的函数的返回值(无论是递归函数还是普通函数)未被使用,则该返回值要么被丢弃,要么在许多语言中是错误的。在某些情况下,最后一次函数调用的返回值会自动重新用作当前函数调用的返回值。这就是为什么您可能会看到未定义的行为,并且无法阻止这种情况,一些智能编译器确实会对此发出警告

递归调用应具有:

基本情况:我们有解决方案和返回值的一些条件。可以有多个基本情况

算法或逻辑更接近我们的基本情况,即将原始问题分解为更简单的问题

递归调用,将较简单的问题传递回函数

int addup(int x)
{
    if (x < 5)
    {
        std::cout<< x++;
        addup(x);
    }
    else return x;
}

int main()
{
    using namespace std;
    int x = 0;
    cout << "And x is:" << addup(x) << endl;

    cin.clear();
    cin.ignore(32767, '\n'); 
    cin.get(); 
    return 0;
}
因此,在本例中,基本情况是x>=5,接近基本情况的逻辑是x++,递归调用与参数x相加。但您不在此处保存返回值,因为返回值可能会被丢弃或丢失,因此可能会导致进一步的问题,因此应按照以下方式妥善处理: 返回addupx

我希望它现在有意义。

您忘了添加报税表,仅此而已:

...
if (x < 5)
{
    std::cout<< x++;
    return addup(x);
//  ^^^^^^
}
...
您忘记添加报税表,仅此而已:

...
if (x < 5)
{
    std::cout<< x++;
    return addup(x);
//  ^^^^^^
}
...