Не мог бы кто-нибудь объяснить рекурсию? (не простую как в примерах с факториалом) - 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в противном случае.