Почему моя функция возвращает правильное значение, даже когда я указываю 8 в качестве первого числа?

#c #recursion

#c #рекурсия

Вопрос:

Я создал функцию для вычисления HCF числа с использованием рекурсии. Проблема, с которой я сталкиваюсь, заключается в том, что в выражении (p% q), как p = 8, так и q = 12. Мой компилятор просто создает p = 12 в цикле рекурсии, хотя выражение (8% 12) = 8.

Итак, рекурсивный цикл «hcf(q, p%q)» должен иметь вид (8,8) во втором вызове функции, но, похоже, это (12,8). Я совершенно не в состоянии понять, как это происходит. По моей логике hcf, возвращаемый функцией, должен был быть равен 8, если я указываю 8 как p (первое число).

Примечание: Моей IDE является Visual studio.

 int hcf(int p , int q )
{
    cout << endl << p << endl << q << endl; // To check what's happening with remainder function in each recursive cycle.
    if (p%q != 0)
    {
        hcf(q, p%q);
    }
    else
        return q;
}

int main()
{
    int f, s;
    cout << "Enter first numbern";
    cin >> f;
    cout << "Enter second numbern";
    cin >> s;
    cout << "The HCF of the numbers is: t" << hcf(f , s) << endl;
}
  

Ответ №1:

Проблема 1: ваше понимание неверно, программа генерирует правильный вывод.

 hcf(p = 8, q = 12)
  hcf(12(q), 8 % 12(p % q)) = hcf(p = 12, q = 8)
    hcf(8(q), 12 % 8(p % q)) = hcf(p = 8, q = 4)
      return 4 (q)
  

в выражении (p% q), как p = 8, и q = 12. Мой компилятор просто создает p = 12

Потому что вы явно передаете второй аргумент q в качестве первого аргумента в рекрутинговом вызове.

Проблема 2: вы должны заменить hcf(q, p%q); на return hcf(q, p%q);

Комментарии:

1. hcf(q, p% q); должно быть hcf (p, p% q); Это правильный способ вычисления HCF.

2. Хорошо, я только что понял свою ошибку.

3. @LiuYubo На самом деле аргументами должны быть large % small и small . Порядок не имеет значения.

4. Кроме того, почему это должно возвращать hcf(q, p% q) вместо hcf(q, p%q)?

5. @MMH Потому что int hcf(int p , int q ) возвращает int . Но if путь просто вычисляет результат, но ничего не возвращает. Таким образом, результат не определен.