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