C ++递归不返回预期值

时间:2016-05-08 04:53:53

标签: c++ return

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

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;
}

4 个答案:

答案 0 :(得分:4)

您在递归调用中缺少return

替换

addup(x);

通过

return addup(x);

如果没有该行中的return,该函数最后会失效,并且会受到未定义的行为的影响。

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

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

答案 1 :(得分:2)

您应该始终在递归期间返回一个值:

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

在某些语言(例如Java)中,原始代码会导致编译器错误,因为它并不总是返回值。在您的C ++编译器中,这显然是允许的,尽管if-else的两个流都应该返回一个值作为良好实践。

答案 2 :(得分:0)

那么,要理解在递归中返回的原因,你可以想到函数调用/堆栈框架的基础知识:

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

如果未使用您调用的函数(无论是递归还是正常)的返回值,则返回值将被丢弃,或者在许多语言中都是错误。在某些情况下,最后一个函数调用的返回值会自动重新用作当前函数调用的返回值。这就是为什么你可能会看到未定义的行为,并防止一些智能编译器对此发出警告。

递归调用应具有:

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

  2. 更接近基本情况的算法或逻辑(即将原始问题分解为更简单的问题)。

  3. 递归调用,将更简单的问题传回函数。

  4. 所以在这种情况下,你的基本情况是(x> = 5),接近基本情况的逻辑是(x ++),递归调用是带参数x的addup。但是你没有在这里保存可能被丢弃或丢失的返回值,因此可能导致进一步的问题,因此应该妥善处理: return addup(x);

    我希望现在有道理。

答案 3 :(得分:0)

您忘记添加return,这就是全部:

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