Оптимизировать вычисление факториала

17. Оптимизировать вычисление факториала

Условие задачи Функция работает слишком медленно на больших входных данных. Нужно предложить более эффективное решение, сохранив корректность результата.

def test(x):
    y = 1
    for i in range(1, x + 1):
        y *= i
    return y
Спойлеры к решению
Подсказки
  • Функция считает факториал числа x.
  • Факториал — это произведение всех чисел от 1 до x.
  • Ручной цикл на Python работает медленнее на больших значениях.
  • Более эффективный вариант — использовать встроенную функцию math.factorial().
  • Она уже оптимизирована и реализована быстрее, чем обычный Python-цикл.
  • Нужно также обработать отрицательные значения, потому что факториал для отрицательных целых чисел не определён.
Решение
import math


def test(x: int) -> int:
    if x < 0:
        raise ValueError("x must be non-negative")

    return math.factorial(x)

Исходная функция:

def test(x):
    y = 1
    for i in range(1, x + 1):
        y *= i
    return y

считает факториал числа x.

Например:

test(5)

должно вернуть:

120

Потому что:

1 * 2 * 3 * 4 * 5 = 120

Оптимизированное решение использует math.factorial(x). Оно сохраняет тот же результат, но работает быстрее, потому что это стандартная оптимизированная реализация факториала.

Пример:

print(test(5))   # 120
print(test(10))  # 3628800