这是我的代码。我希望它返回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;
}
答案 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语句将值传递回当前函数调用帧的直接调用者。在递归的情况下,这个直接调用者可以是对同一函数的另一个调用。
如果未使用您调用的函数(无论是递归还是正常)的返回值,则返回值将被丢弃,或者在许多语言中都是错误。在某些情况下,最后一个函数调用的返回值会自动重新用作当前函数调用的返回值。这就是为什么你可能会看到未定义的行为,并防止一些智能编译器对此发出警告。
递归调用应具有:
基本情况:我们有一个解决方案和一个返回值的条件。可能有多个基本案例。
更接近基本情况的算法或逻辑(即将原始问题分解为更简单的问题)。
递归调用,将更简单的问题传回函数。
所以在这种情况下,你的基本情况是(x> = 5),接近基本情况的逻辑是(x ++),递归调用是带参数x的addup。但是你没有在这里保存可能被丢弃或丢失的返回值,因此可能导致进一步的问题,因此应该妥善处理: return addup(x);
我希望现在有道理。
答案 3 :(得分:0)
您忘记添加return
,这就是全部:
...
if (x < 5)
{
std::cout<< x++;
return addup(x);
// ^^^^^^
}
...