From facef1ee52562171206d98f0ff5e88392d367990 Mon Sep 17 00:00:00 2001 From: Emilianouz <135679131+Emilianouz@users.noreply.github.com> Date: Sun, 1 Mar 2026 16:08:21 +0000 Subject: [PATCH 1/3] Optimize Fibonacci and Making Change functions with caching for improved performance --- .../fibonacci/fibonacci.py | 12 +++++- .../making_change/making_change.py | 37 ++++++++++++------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py index 60cc667..4a91524 100644 --- a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py +++ b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py @@ -1,4 +1,12 @@ -def fibonacci(n): +def fibonacci(n, cache={}): + '''Adding a dictionary to store a copy of what we have already calculated, the complexity becomes linear. + With the cache, each value is computed once, bringing it down to O(n) + ''' if n <= 1: return n - return fibonacci(n - 1) + fibonacci(n - 2) + + if n in cache: + return cache[n] + + cache[n] = fibonacci(n - 1, cache) + fibonacci(n - 2, cache) + return cache[n] 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..23725f9 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -7,26 +7,35 @@ 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], 0, cache) -def ways_to_make_change_helper(total: int, coins: List[int]) -> int: +def ways_to_make_change_helper( + total: int, coins: List[int], coin_index: int, cache: dict +) -> int: """ Helper function for ways_to_make_change to avoid exposing the coins parameter to callers. """ - if total == 0 or len(coins) == 0: + if total == 0: + return 1 + if coin_index == len(coins): return 0 + key = (total, coin_index) + if key in cache: + return cache[key] + + coin = coins[coin_index] ways = 0 - for coin_index in range(len(coins)): - coin = coins[coin_index] - count_of_coin = 1 - while coin * count_of_coin <= total: - total_from_coins = coin * count_of_coin - if total_from_coins == total: - ways += 1 - else: - intermediate = ways_to_make_change_helper(total - total_from_coins, coins=coins[coin_index+1:]) - ways += intermediate - count_of_coin += 1 + + # the remaining coins can complete whatever total is left over + while coin * count <= total: + ways += ways_to_make_change_helper(total - coin * count, coins, coin_index + 1, cache) + count += 1 + + # counting combinations that don't use the current coin + ways += ways_to_make_change_helper(total, coins, coin_index + 1, cache) + + cache[key] = ways return ways From 09d11b014d71141acb7eb46d1767e9523d72b506 Mon Sep 17 00:00:00 2001 From: Emiliano Uruena Date: Sun, 1 Mar 2026 16:24:04 +0000 Subject: [PATCH 2/3] External caching in fibonacci function Refactored fibonacci function to use a cache for improved performance. --- Sprint-2/improve_with_caches/fibonacci/fibonacci.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py index 4a91524..70891ab 100644 --- a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py +++ b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py @@ -1,4 +1,6 @@ -def fibonacci(n, cache={}): +cache={} + +def fibonacci(n): '''Adding a dictionary to store a copy of what we have already calculated, the complexity becomes linear. With the cache, each value is computed once, bringing it down to O(n) ''' From 7e48b4656e8c0f438c84d133497260b30771a311 Mon Sep 17 00:00:00 2001 From: Emiliano Uruena Date: Mon, 2 Mar 2026 20:01:37 +0000 Subject: [PATCH 3/3] Initialise count variable for coin multiples in change function Add a count variable to track coin multiples in the change calculation. --- Sprint-2/improve_with_caches/making_change/making_change.py | 1 + 1 file changed, 1 insertion(+) 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 23725f9..6b82e65 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -30,6 +30,7 @@ def ways_to_make_change_helper( ways = 0 # the remaining coins can complete whatever total is left over + count = 1 while coin * count <= total: ways += ways_to_make_change_helper(total - coin * count, coins, coin_index + 1, cache) count += 1