From 13ad347d018903866754a5439288339073e3421d Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Sun, 4 Oct 2026 07:28:51 +0100 Subject: [PATCH 1/4] refactor: improve Fibonacci using cache --- Sprint-2/improve_with_caches/fibonacci/fibonacci.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py index 60cc667..8e7730e 100644 --- a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py +++ b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py @@ -1,4 +1,13 @@ +cache = {} def fibonacci(n): - if n <= 1: + if n < 0 : + raise ValueError("n must be non-negative number") + + if n <= 1: return n - return fibonacci(n - 1) + fibonacci(n - 2) + + if n in cache: + return cache[n] + + cache[n] = fibonacci(n - 1) + fibonacci(n - 2) + return cache[n] From eaca2880b3c0c1b58fd5df74cab926ecf9ebb778 Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Sun, 4 Oct 2026 12:15:07 +0100 Subject: [PATCH 2/4] refactor: memoize ways to make change --- .../making_change/making_change.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Sprint-2/improve_with_caches/making_change/making_change.py b/Sprint-2/improve_with_caches/making_change/making_change.py index 255612e..872f98d 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -7,13 +7,17 @@ def ways_to_make_change(total: int) -> int: For instance, there are two ways to make a value of 3: with 3x 1 coins, or with 1x 1 coin and 1x 2 coin. """ - return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1]) + cache = {} + return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1],cache) -def ways_to_make_change_helper(total: int, coins: List[int]) -> int: +def ways_to_make_change_helper(total: int, coins: List[int],cache:dict[tuple,int]) -> int: """ Helper function for ways_to_make_change to avoid exposing the coins parameter to callers. """ + key = (total,tuple(coins)) + if key in cache: + return cache[key] if total == 0 or len(coins) == 0: return 0 @@ -26,7 +30,9 @@ def ways_to_make_change_helper(total: int, coins: List[int]) -> int: if total_from_coins == total: ways += 1 else: - intermediate = ways_to_make_change_helper(total - total_from_coins, coins=coins[coin_index+1:]) + intermediate = ways_to_make_change_helper(total - total_from_coins, coins=coins[coin_index+1:],cache=cache) ways += intermediate count_of_coin += 1 + + cache[key]= ways return ways From b9a640c99e0ae4c9a66f2ca9f3b7a41e673dc10a Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Mon, 5 Oct 2026 21:32:01 +0100 Subject: [PATCH 3/4] style: format code --- .../fibonacci/fibonacci.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py index 8e7730e..83f7a16 100644 --- a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py +++ b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py @@ -1,13 +1,15 @@ cache = {} + + def fibonacci(n): - if n < 0 : - raise ValueError("n must be non-negative number") - - if n <= 1: + if n < 0: + raise ValueError("n must be non-negative number") + + if n <= 1: return n - - if n in cache: - return cache[n] - - cache[n] = fibonacci(n - 1) + fibonacci(n - 2) + + if n in cache: + return cache[n] + + cache[n] = fibonacci(n - 1) + fibonacci(n - 2) return cache[n] From 8dba671546f6395a17c0cc1156a5fabaf1dc26ea Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Mon, 5 Oct 2026 21:32:36 +0100 Subject: [PATCH 4/4] style: format code --- .../making_change/making_change.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Sprint-2/improve_with_caches/making_change/making_change.py b/Sprint-2/improve_with_caches/making_change/making_change.py index 872f98d..16dd85e 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -8,14 +8,16 @@ def ways_to_make_change(total: int) -> int: For instance, there are two ways to make a value of 3: with 3x 1 coins, or with 1x 1 coin and 1x 2 coin. """ cache = {} - return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1],cache) + return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1], cache) -def ways_to_make_change_helper(total: int, coins: List[int],cache:dict[tuple,int]) -> int: +def ways_to_make_change_helper( + total: int, coins: List[int], cache: dict[tuple, int] +) -> int: """ Helper function for ways_to_make_change to avoid exposing the coins parameter to callers. """ - key = (total,tuple(coins)) + key = (total, tuple(coins)) if key in cache: return cache[key] if total == 0 or len(coins) == 0: @@ -30,9 +32,11 @@ def ways_to_make_change_helper(total: int, coins: List[int],cache:dict[tuple,int if total_from_coins == total: ways += 1 else: - intermediate = ways_to_make_change_helper(total - total_from_coins, coins=coins[coin_index+1:],cache=cache) + intermediate = ways_to_make_change_helper( + total - total_from_coins, coins=coins[coin_index + 1 :], cache=cache + ) ways += intermediate count_of_coin += 1 - cache[key]= ways + cache[key] = ways return ways