Рекурсивный расчёт факториала числа

Рекурсия останавливается на 0 или 1 и возвращает num × factorialRecursive(num − 1). Отрицательный ввод и переполнение int нужно обработать явно.

Короткий ответ

Что ответить на собеседовании

Рекурсия останавливается на 0 или 1 и возвращает num × factorialRecursive(num − 1). Отрицательный ввод и переполнение int нужно обработать явно.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать рекурсивную функцию, которая возвращает факториал заданного числа.

int factorialRecursive(int num) {
    // реализовать рекурсивное вычисление факториала
}

Примеры использования:

factorialRecursive(5) → 120
factorialRecursive(0) → 1

Ответ

Рекурсия останавливается на 0 или 1 и возвращает num × factorialRecursive(num − 1). Отрицательный ввод и переполнение int нужно обработать явно.

Вариант для обычного 32-битного int:

#include <limits>
#include <stdexcept>

int factorialRecursive(int num) {
    static_assert(std::numeric_limits<int>::digits == 31);
    if (num < 0) throw std::invalid_argument("negative argument");
    if (num > 12) throw std::overflow_error("int factorial overflow");
    if (num <= 1) return 1;
    return num * factorialRecursive(num - 1);
}

12! помещается в такой int, а 13! — нет. Проверка верхней границы предотвращает и чрезмерную глубину рекурсии. Для другого диапазона типа нужно пересчитать ограничение. В общем случае число вызовов и глубина стека O(n).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее