Задачи на функции в языке Python - факториал

Раздел: Python -> Учебные задачи

Задачи на функции в Python: вычисление факториала

Функции в Python помогают организовать код и решать повторяющиеся задачи. Рассмотрим классическую задачу вычисления факториала числа и различные способы её реализации. Факториал числа n (обозначается n!) определяется как произведение всех целых чисел от 1 до n, причём 0! = 1.

Как эффективно вычислить факториал без рекурсии?

Самое простое и эффективное решение - итеративная функция. Она использует цикл for и одну переменную для накопления результата. Время выполнения O(n), память O(1).

def factorial_iter(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result

print(factorial_iter(5))  # 120

алгоритм решения задачи python (алгоритм решения задачи на python)

Пояснение: функция начинается с результата 1. Затем перебираются числа от 2 до n включительно. На каждом шаге текущее число умножается на result. При n = 0 цикл не выполняется, и возвращается 1.

Типичные ошибки: забыть учесть n = 0 (функция должна вернуть 1). Использование range(1, n+1) - лишнее умножение на 1, но не ошибка. При очень больших n (например, n > 1000) результат может стать огромным, но Python справляется с целыми числами произвольной длины, однако время выполнения растёт.

Как решить задачу с помощью рекурсии?

def factorial_rec(n):
    if n == 0:
        return 1
    return n * factorial_rec(n - 1)

print(factorial_rec(5))  # 120

базовые задачи python (базовые задачи python)

Рекурсивная функция вызывает саму себя с уменьшенным аргументом, пока не достигнет базового случая (n == 0). Такой подход наглядно демонстрирует математическое определение факториала.

Проблемы: рекурсия имеет ограничение глубины (по умолчанию около 1000). При n > 1000 возникнет RecursionError. Для больших чисел рекурсия неприменима. Кроме того, каждый вызов сохраняется в стеке, что потребляет память O(n).

Цель использования: учебные примеры, демонстрация рекурсии, задачи с небольшими n.

Как использовать functools.reduce для факториала?

from functools import reduce

def factorial_reduce(n):
    return reduce(lambda x, y: x * y, range(1, n + 1), 1)

print(factorial_reduce(5))  # 120

задачи для обучения python (задачи для обучения python)

Функция reduce последовательно применяет лямбду к элементам последовательности, накапливая результат. Третьим аргументом передаётся начальное значение (1).

Особенности: код компактный, но менее читаемый. При n = 0 range(1, 1) пуст, reduce вернёт начальное значение 1. Это корректно.

Случаи использования: когда требуется функциональный стиль или цепочка операций.

Как применить кэширование (lru_cache) для улучшения рекурсии?

from functools import lru_cache

@lru_cache(maxsize=None)
def factorial_cache(n):
    if n == 0:
        return 1
    return n * factorial_cache(n - 1)

print(factorial_cache(5))  # 120

задачи на классы в python (задачи на классы в python)

Декоратор lru_cache запоминает результаты уже вычисленных значений. При повторных вызовах с тем же аргументом значение берётся из кэша. Это не делает рекурсию глубже, но ускоряет многократные вызовы.

Ошибка: глубина рекурсии всё ещё ограничена. Кэш не решает проблему RecursionError. Применять для задач, где функция вызывается много раз с одними и теми же аргументами.

Как использовать встроенную функцию math.factorial?

import math
print(math.factorial(5))  # 120

В Python уже есть готовая реализация факториала в модуле math. Она написана на C и максимально оптимизирована.

Недостаток: не получится изучить принцип работы или адаптировать для собственных нужд. Однако для повседневных задач это лучший выбор.

Случаи использования: продакшен, быстрые вычисления, когда не требуется кастомная логика.

- задачи на операторы в python (задачи на операторы в python)
- задачи на последовательности python (задачи на последовательности в python)
- задачи на списки python (задачи на списки в python)

Расширенные примеры работы с функциями для факториала

Вычисление факториала для списка чисел с помощью map

Пример
import math
numbers = [0, 1, 2, 5, 10]
factorials = list(map(math.factorial, numbers))
print(factorials)
[1, 1, 2, 120, 3628800]

Пояснение: функция map применяет math.factorial к каждому элементу списка. Результат преобразуется в список.

Генератор последовательности факториалов

Пример
def factorial_gen(n):
    result = 1
    for i in range(1, n + 1):
        result *= i
        yield result

for val in factorial_gen(5):
    print(val, end=' ')
1 2 6 24 120

Генератор yield выдаёт факториалы по одному, не храня весь список в памяти.

Мемоизация вручную через словарь

Пример
fact_cache = {0: 1}
def factorial_memo(n):
    if n not in fact_cache:
        fact_cache[n] = n * factorial_memo(n - 1)
    return fact_cache[n]

print(factorial_memo(7))  # 5040
print(fact_cache)         # словарь с промежуточными результатами
5040
{0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120, 6: 720, 7: 5040}

Пояснение: функция проверяет наличие ключа в словаре. Если его нет - рекурсивно вычисляет и сохраняет. Это аналог lru_cache, написанный вручную.

Функция высшего порядка: возврат функции для вычисления факториала

Пример
def make_factorial():
    def factorial(n):
        result = 1
        for i in range(2, n + 1):
            result *= i
        return result
    return factorial

fact = make_factorial()
print(fact(6))  # 720

Замыкание make_factorial создаёт новую функцию factorial, которая может быть использована многократно.

Рекурсия с хвостовой рекурсией (имитация через аккумулятор)

Пример
def factorial_tail(n, acc=1):
    if n == 0:
        return acc
    return factorial_tail(n - 1, acc * n)

print(factorial_tail(5))  # 120

Внимание: Python не оптимизирует хвостовую рекурсию, поэтому это лишь стилистический приём для упрощения кода, но глубина стека не уменьшается.

Комбинирование функций: факториал через лямбду и reduce

Пример
from functools import reduce
factorial_lambda = lambda n: reduce(lambda x, y: x * y, range(1, n + 1), 1)
print(factorial_lambda(10))  # 3628800

Анонимная функция присваивается переменной, что не рекомендуется по PEP 8, но демонстрирует возможности.

Задачи на функции в Python - comments

En
задачи на функции в python (python)