Рекурсивная версия:
def fact_rec(n: int) -> int:
if n <= 1:
return 1
return n * fact_rec(n - 1)
Итеративная версия:
def fact_iter(n: int) -> int:
result = 1
for i in range(2, n + 1):
result *= i
return result
print(fact_iter(5)) # 120
print(fact_iter(10)) # 3628800
Сравнение:
- Рекурсия удобочитаема, но для $n > 1000$ может упереться в лимит стека Python (
RecursionError). Лимит регулируется sys.setrecursionlimit, но дороже по памяти.
- Итерация использует $O(1)$ стека и работает даже при $n = 10^5$.
Целые числа в Python имеют неограниченную точность, поэтому fact_iter(100) вычислится точно (158-значное число).