C++递归不返回预期值
这是我的密码。我希望它返回5,因为增量为1。问题是如果x>=5,那么如何将值返回到主函数?一个函数中应该只有一个返回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 <<
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);
// ^^^^^^
}
...