From 13ad347d018903866754a5439288339073e3421d Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Sun, 4 Oct 2026 07:28:51 +0100 Subject: [PATCH 1/5] 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 60cc6671..8e7730e8 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/5] 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 255612e5..872f98df 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/5] 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 8e7730e8..83f7a166 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/5] 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 872f98df..16dd85e6 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 From 205bf67567c34887e33f8690d63370b0947d7562 Mon Sep 17 00:00:00 2001 From: Ahmad Hmedan Date: Sun, 11 Oct 2026 15:04:39 +0100 Subject: [PATCH 5/5] refactor: reduce memory usage by replacing list slicing with start index --- .../making_change/making_change.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 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 16dd85e6..07a1e778 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -8,23 +8,23 @@ 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], 0, cache) def ways_to_make_change_helper( - total: int, coins: List[int], cache: dict[tuple, int] + total: int, coins: List[int], start_index: 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, start_index) if key in cache: return cache[key] - if total == 0 or len(coins) == 0: + if total == 0 or start_index >= len(coins) : return 0 ways = 0 - for coin_index in range(len(coins)): + for coin_index in range(start_index, len(coins)): coin = coins[coin_index] count_of_coin = 1 while coin * count_of_coin <= total: @@ -33,7 +33,10 @@ def ways_to_make_change_helper( ways += 1 else: intermediate = ways_to_make_change_helper( - total - total_from_coins, coins=coins[coin_index + 1 :], cache=cache + total=total - total_from_coins, + coins=coins, + start_index=coin_index + 1, + cache=cache, ) ways += intermediate count_of_coin += 1