Рекурсия останавливается на 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).