Не мог бы кто-нибудь объяснить рекурсию? (не простую как в примерах с факториалом) - 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); }
Решение задачи: «Не мог бы кто-нибудь объяснить рекурсию? (не простую как в примерах с факториалом)»
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
, и возвращает результат этого вызова.
Вот список действий, которые происходят в коде:
- Проверка:
n >= 0
. Еслиn
меньше или равно нулю, функция возвращает0
. - Проверка:
(n % 6) == 0
. Если остаток от деленияn
на6
равен0
, функция возвращает0
. - Проверка:
(n % 9) == 0
. Если остаток от деленияn
на9
равен0
, функция возвращает0
. - Проверка:
(n % 20) == 0
. Если остаток от деленияn
на20
равен0
, функция возвращает0
. - Рекурсивный вызов функции
mcn
с аргументомn-6
. - Рекурсивный вызов функции
mcn
с аргументомn-9
. - Рекурсивный вызов функции
mcn
с аргументомn-20
. - Если все предыдущие проверки и рекурсивные вызовы вернули
1
, функция возвращает1
. Таким образом, функцияmcn
возвращает1
, еслиn
больше или равно6
, больше или равно9
и больше или равно20
, и0
в противном случае.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д