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

Итак, вот моя простая программа для вычисления величайшего общего делителя. Он возвращает значение мусора каждый раз так же, как 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
}
}

0

Решение

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

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

1

Другие решения

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

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)

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

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

2

По вопросам рекламы [email protected]