Ниже подробное решение с объяснениями и примером кода на Python, реализующее вычисление N! через рекурсивную функцию. Это подходит для средней школы и понятно, даже если предмет и класс не указаны.
Что такое рекурсия для факториала
- Базовый случай: 0! = 1 и 1! = 1.
- Рекурсивный шаг: для n > 1 факториал определяется как n! = n · (n−1)!.
- Реализация повторяет этот шаг до достижения базового случая.
Пояснение к работе кода
- Функция factorial(n) принимает неотрицательное целое n.
- При n = 0 или n = 1 возвращает 1 (базовый случай).
- При n > 1 возвращает n * factorial(n-1) (рекурсивный вызов).
- В главной части программы считывается N и выводится N!.
Код на Python (рекурсивная реализация) def factorial(n): if n < 0: raise ValueError("N должен быть неотрицательным") if n == 0 or n == 1: return 1 return n * factorial(n - 1)
if name == "main": try: n = int(input("Введите неотрицательное число N: ").strip()) if n < 0: print("Ошибка: N должен быть неотрицательным.") else: print(f"{n}! = {factorial(n)}") except ValueError: print("Некорректный ввод. Введите неотрицательное целое число.")
Пример работы
- Ввод: 5
- Вывод: 5! = 120 Пошагово: 5! = 5 × 4!; 4! = 4 × 3!; 3! = 3 × 2!; 2! = 2 × 1!; 1! = 1. Итак, 5! = 5×4×3×2×1 = 120.
Замечания и предупреждения
- Время выполнения: O(N), количество умножений — N.
- Потребление памяти: O(N) из-за глубины стека рекурсии.
- У Python глубины рекурсии ограничены (по умолчанию примерно 1000). Для больших N может возникнуть RecursionError. В таком случае можно:
- увеличить предел рекурсии (не рекомендуется без остановки на разумных N): import sys; sys.setrecursionlimit(2000)
- использовать итеративную реализацию факториала (или встроенную math.factorial).
- или использовать математическую оптимизацию для очень больших N (вычислять модуль или с использованием больших чисел без рекурсии).
Альтернативно (для сравнения) — итеративная версия без рекурсии (для проверки и для больших N): def factorial_iter(n): if n < 0: raise ValueError("N должен быть неотрицательным") result = 1 for i in range(2, n + 1): result *= i return result
Если хотите, могу привести аналогичный пример на другом языке (C++, Java) или адаптировать задачу под конкретный класс и язык программирования.