Не мог бы кто-нибудь объяснить рекурсию? (не простую как в примерах с факториалом) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день, вообще я не фанат создавания тем с простыми вопросами, я знаю что такое поиск, но в данном случае я просто не знаю как сформулировать вопрос и что именно искать. Код на С я потерял, а в разделе питона нет подраздела для новичков, так что напишу на питоне, разницы все равно почти нет:
def McNuggets(n):
    return n >= 0 and (n == 0 or n % 6 == 0 or n % 9 == 0 or n % 20 == 0 or McNuggets(n - 6) or McNuggets(n - 9) or McNuggets(n - 20))
Вот какую задачу этот код призван решать:

McDonald’s sells Chicken McNuggets in packages of 6, 9 or 20 McNuggets. Thus, it is possible, for example, to buy exactly 15 McNuggets (with one package of 6 and a second package of 9), but it is not possible to buy exactly 16 McNuggets, since no non- negative integer combination of 6's, 9's and 20's add up to 16. To determine if it is possible to buy exactly n McNuggets, one has to find non-negative integer values of a, b, and c such that 6a + 9b + 20c = n Write a function, called McNuggets that takes one argument, n, and returns True if it is possible to buy a combination of 6, 9 and 20 pack units such that the total number of McNuggets equals n, and otherwise returns False.

Это задача из курса EDx(может кто знает). Я ее так и не решил, но вообще нашел вот такой вот код. Код работает правильно, с ним проблем нет. Проблема в том что я никак не могу понять как тут работает рекурсия. Может кто-нибудь объяснить пошагово либо дать ссылку куда следует, либо если для таких функций есть какое-то особенное название - дать это название. Спасибо. На всякий случай: Как работает
int factorial(int x) { 
    return !x ? 1 : x * factorial(x - 1);
}
я понимаю.

Решение задачи: «Не мог бы кто-нибудь объяснить рекурсию? (не простую как в примерах с факториалом)»

textual
Листинг программы
int mcn(int n) {
  return (n>=0) && (!(n%6) || !(n%9) || !(n%20)
          || mcn(n-6) || mcn(n-9) || mcn(n-20));
}

Объяснение кода листинга программы

В данном коде реализована функция mcn, которая принимает целочисленный аргумент n. Функция проверяет, является ли n неотрицательным числом, и возвращает 1, если это так, и 0 в противном случае. Функция использует оператор % для проверки остатка от деления n на 6, 9 и 20. Если остаток от деления n на любое из этих чисел равен 0, то функция возвращает 0. Если остаток от деления n на эти числа не равен 0, то функция рекурсивно вызывает саму себя, передавая в качестве аргумента n-6, n-9 или n-20, и возвращает результат этого вызова. Вот список действий, которые происходят в коде:

  1. Проверка: n >= 0. Если n меньше или равно нулю, функция возвращает 0.
  2. Проверка: (n % 6) == 0. Если остаток от деления n на 6 равен 0, функция возвращает 0.
  3. Проверка: (n % 9) == 0. Если остаток от деления n на 9 равен 0, функция возвращает 0.
  4. Проверка: (n % 20) == 0. Если остаток от деления n на 20 равен 0, функция возвращает 0.
  5. Рекурсивный вызов функции mcn с аргументом n-6.
  6. Рекурсивный вызов функции mcn с аргументом n-9.
  7. Рекурсивный вызов функции mcn с аргументом n-20.
  8. Если все предыдущие проверки и рекурсивные вызовы вернули 1, функция возвращает 1. Таким образом, функция mcn возвращает 1, если n больше или равно 6, больше или равно 9 и больше или равно 20, и 0 в противном случае.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы