From 27fce127b26b1c46121583340fd70af53bdfd08a Mon Sep 17 00:00:00 2001 From: Nadim Najjar Date: Tue, 15 Jul 2025 17:02:29 +0300 Subject: [PATCH 1/2] optimizing factorial using memoization --- dynamic_programming/factorial.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/dynamic_programming/factorial.py b/dynamic_programming/factorial.py index 1c9c927f5af3..b838f2a755a3 100644 --- a/dynamic_programming/factorial.py +++ b/dynamic_programming/factorial.py @@ -4,24 +4,39 @@ @lru_cache -def factorial(num: int) -> int: +def factorial(num, _memo=None): """ + Returns the factorial of a non-negative integer using memoization. + + >>> factorial(0) + 1 + >>> factorial(5) + 120 >>> factorial(7) 5040 >>> factorial(-1) Traceback (most recent call last): - ... + ... ValueError: Number should not be negative. >>> [factorial(i) for i in range(10)] [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880] """ + if _memo is None: + _memo = {} + if num < 0: raise ValueError("Number should not be negative.") - return 1 if num in (0, 1) else num * factorial(num - 1) + if num in _memo: + return _memo[num] + if num in (0, 1): + _memo[num] = 1 + else: + _memo[num] = num * factorial(num - 1, _memo) + + return _memo[num] if __name__ == "__main__": import doctest - doctest.testmod() From e9e3cdacea4231c174f4b70f4d10a7ad5a6f7eee Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 14:05:01 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dynamic_programming/factorial.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dynamic_programming/factorial.py b/dynamic_programming/factorial.py index b838f2a755a3..158da7d8523f 100644 --- a/dynamic_programming/factorial.py +++ b/dynamic_programming/factorial.py @@ -37,6 +37,8 @@ def factorial(num, _memo=None): return _memo[num] + if __name__ == "__main__": import doctest + doctest.testmod()