C ++, рекурсивный правильный ответ, но не возвращается правильно

0

Хорошо, так что моя простая программа для расчета Величайшего общего делителя. Он возвращает стоимость мусора каждый раз, как 46332964. Я думал над головой в течение часа, но, похоже, не понял эту проблему. После исследования я также включил прототип, но до сих пор не повезло. Он работает до тех пор, пока он не вернется. Скопируйте код и запустите его и, пожалуйста, помогите мне.

#include <iostream>
using namespace std;

int calculate_gcd(int aa, int bb, int rem, int g);

int main()
{
    int a, b;
    int rem = -1;
    int gcd=0;

    cout << "Number 1: "; //taking inputs
    cin >> a;
    cout << "Number 2: ";
    cin >> b;

    if (a < b) //swapping if number greater than the number according to the code
    {
       a = a + b;
       b = a - b;
       a = a - b;
    }

    gcd = calculate_gcd(a, b, rem, gcd);

    if (a <= 0 || b <= 0)
    {
       rem = 0;
       cout <<"GCD doesnot exists\n";
    } //just in case of zeros
    else
        cout << "\nthe GCD of "<<a <<" and "<<b <<" is "<<gcd <<"\n\n"; //the main answer

    system("pause");
    return 0;
}

int calculate_gcd(int aa, int bb, int rem, int g)
{
    if (rem != 0)
    {
       if (aa%bb == 0)
        {
           rem = 0;
           g = bb;
           printf("**GCD is %d\n", g);
        }
        else {
             rem = aa % bb;
             aa = bb;
             bb = rem;
        }
        calculate_gcd(aa, bb, rem, g);
    }
    else {
         printf("**here also GCD is correct as %d \n", g);
         return g; //returning 
         }
}
Теги:
recursion
return
garbage

2 ответа

1
Лучший ответ

Вам не хватает возврата. Вы должны использовать return calculate_gcd(aa, bb, rem, g); а не просто рекурсивно.

Вы можете поймать это с помощью clang, используя -Wreturn-type. Другие компиляторы, вероятно, также имеют предупреждение для этого.

  • 0
    Спасибо. похоже на работу. Я изменил рекурсивную строку на «return Calculate_gcd (aa, bb, rem, g);» и пусть вернет г; остаться. но почему? кажется, очень трудно думать об этом :(
  • 1
    тип calculate_gcd - int (int aa, int bb, int rem, int g) . Это означает, что, учитывая aa , bb , rem и g , вы обещаете вернуть int . Если ваша функция решает выполнить рекурсию, она вызывает новую копию этой функции. Это не освобождает вас от обещания вернуть целое число. Фактически, не возвращая целое число, когда вы говорите, что в результате вы получите неопределенное поведение.
2

Функциональная головка

int calculate_gcd(int aa, int bb, int rem, int g)

указывает, что g передается по значению.

Это означает, что в вызове, указанное значение копируется в локальном этот вызове функции в g. Изменения в этом локальном g не влияют на вызывающий сайт.

Вместо этого вы должны return результат функции, а затем вам не нужен аргумент g:

int calculate_gcd(int aa, int bb, int rem)

Более тщательный анализ покажет вам, что вам действительно не нужен аргумент rem, так что:

int calculate_gcd(int aa, int bb)

Попутно, в качестве новичка вы значительно выиграете от использования iostreams C++, например cout, вместо низкоуровневых функций C i/o, таких как printf. Это потому, что printf и family не выполняют проверку типов, поэтому очень легко ошибиться.

Кроме того, хотя это может звучать просто как бальдердаш, вы выиграете много, выстроив вещи правильно вертикально, то есть используя 100% -ный последовательный отступ. К счастью, есть бесплатные инструменты, которые помогают в этом. Если ваш любимый IDE или редактор не поддерживает автоматическое форматирование исходного кода, ознакомьтесь с бесплатной программой AStyle.

  • 0
    Спасибо, я наверное это понимаю. Я попробую это завтра из-за времени сна здесь. Затем выберите правильный ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню