我正在按照欧几里德算法编写一个相当简单的程序(我们必须使用递归编写)。当在C++ Tutor中执行时,它确实运行良好,但是当我在终端中编译程序时,它已经给了我:
警告:控制可能会到达非空函数[-Wreturn-type]
的结尾
当我尝试在终端中执行它时,它会抛出:
运行时错误:执行到达返回值函数的末尾而没有返回值
(但是我要返回值吗?)
为什么它可以与c ++导师一起使用,但不能在Linux终端(使用clang编译器)中使用?
我试图在函数中使用一些额外的变量使过程更清晰,但我仍然不明白为什么它会认为在某些情况下我不会返回值。
#include <iostream>
using namespace std;
int ggt(int a, int b){
int rest{0};
int zaehler{0};
int divisor{0};
if(a>=b){
zaehler=a;
divisor=b;
if(a%b==0){
return b;
}
else{
rest=a%b;
divisor=rest;
zaehler=b;
ggt(zaehler, divisor);
}
}
else{
zaehler=b;
divisor=a;
if(b%a==0){
return a;
}
else{
rest=b%a;
divisor=rest;
zaehler=a;
::durchlaeufe--;
ggt(zaehler, divisor);
}
}
}
int main(){
int a{40}, b{12};
cout << "Bitte Zaehler eingeben: ";
cin >> a;
cout << "\n";
cout << "Bitte Nenner eingeben: ";
cin >> b;
cout << "\n";
if(ggt(a, b)==0){
cout << "ERROR\n";
}
else {
cout << "Der groesste gemeinsame Teiler ist: " << ggt(a, b) << "\n";
}
return 0;
}
在此示例中,当a = 40且b = 12时,结果应为4。这正是C ++导师说的...
答案 0 :(得分:1)
已经给出了实际答案(在递归调用中未返回)。
我想添加一个简单的版本供您比较,甚至可以学到一些东西:)
int ggt(int a, int b)
{
if (a < b)
{
std::swap(a, b);
}
if (a%b == 0)
{
return b;
}
return ggt(b, a%b);
}
简短说明: