程序在C ++ Tutor中执行时有效,但在其他任何地方都不能

时间:2019-04-15 19:14:48

标签: c++

我正在按照欧几里德算法编写一个相当简单的程序(我们必须使用递归编写)。当在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 ++导师说的...

1 个答案:

答案 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);
 }

简短说明:

  • a
  • 在调用递归时直接计算“ rest”(a%b)(这避免了存储中间值)
  • 如您所见,控制流程更简单,因此更容易推理出执行的每个步骤。