магазин Лувр

Подскажите пожалуйста, как работает эта рекурсия? Язык Си

Рекурсия - это когда функция вызывает саму себя. Это мощный инструмент для решения задач, которые могут быть разбиты на подзадачи. Определение функции внутри своего же тела может показаться странным, но если правильно использовать рекурсию, она может быть очень полезной.

Давайте рассмотрим пример рекурсивной функции на языке программирования Си, чтобы лучше понять, как это работает.

#include <stdio.h>

// Пример рекурсивной функции нахождения факториала числа
int factorial(int n) {
    // Базовый случай: факториал 0 или 1 равен 1
    if (n == 0 || n == 1) {
        return 1;
    }
    // Рекурсивный случай: вызов функции с уменьшенным на 1 аргументом
    else {
        return n * factorial(n - 1);
    }
}

int main() {
    int number = 5;
    int result = factorial(number);

    printf("Факториал числа %d равен %d", number, result);
    
    return 0;
}

В приведенном выше примере функция factorial рекурсивно вызывает саму себя, чтобы найти факториал числа. В начале функции проверяется базовый случай, когда n равно 0 или 1. В этом случае функция возвращает 1, потому что факториал 0 или 1 равен 1.

В рекурсивном случае функция вызывает саму себя с аргументом, уменьшенным на 1 (n - 1). Затем рекурсивная функция будет вызываться до тех пор, пока не достигнет базового случая.

Пример выше иллюстрирует работу рекурсии. Если мы вызываем функцию factorial(5), то сначала проверяем базовый случай, который в данном случае не выполняется. Затем происходит рекурсивный вызов factorial(4), который в свою очередь вызывает factorial(3), и так далее, пока не достигнется базовый случай.

Когда достигнут базовый случай, значения факториала начинают возвращаться по цепочке. factorial(1) возвращает 1, factorial(2) возвращает 2 * factorial(1) или 2, factorial(3) возвращает 3 * factorial(2) или 6, и так далее. Наконец, factorial(5) возвращает 5 * factorial(4) или 120.

В функции main мы вызываем factorial с числом 5 и выводим результат.

Рекурсия может быть сложной концепцией для понимания, но она открывает множество возможностей для решения различных задач. Правильное использование рекурсии может существенно упростить код и повысить его читабельность, но также требует внимательной оценки базовых и рекурсивных случаев, чтобы избежать запутанности или зацикливания.