From 527cba8f01fb3519b5b52268e50f2fe18e4d14e4 Mon Sep 17 00:00:00 2001 From: Rihanna P <114884466+RihannaP@users.noreply.github.com> Date: Fri, 30 Jan 2026 20:33:16 +0000 Subject: [PATCH 1/3] Add dic cache and math check --- .../fibonacci/fibonacci.py | 10 +++++++++- .../making_change/making_change.py | 19 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py index 60cc667..143fb5b 100644 --- a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py +++ b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py @@ -1,4 +1,12 @@ +memo = {} + def fibonacci(n): + if n in memo: + return memo[n] + if n <= 1: return n - return fibonacci(n - 1) + fibonacci(n - 2) + result = fibonacci(n - 1) + fibonacci(n - 2) + memo[n] = result + + return result 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..9ffd0ba 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -1,12 +1,13 @@ from typing import List - - +cache = {} def ways_to_make_change(total: int) -> int: """ Given access to coins with the values 1, 2, 5, 10, 20, 50, 100, 200, returns a count of all of the ways to make the passed total value. 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.clear() return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1]) @@ -14,9 +15,20 @@ def ways_to_make_change_helper(total: int, coins: List[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 - + + if len(coins) == 1: + if total % coins[0] == 0: + return 1 + else: + return 0 + ways = 0 for coin_index in range(len(coins)): coin = coins[coin_index] @@ -29,4 +41,5 @@ def ways_to_make_change_helper(total: int, coins: List[int]) -> int: intermediate = ways_to_make_change_helper(total - total_from_coins, coins=coins[coin_index+1:]) ways += intermediate count_of_coin += 1 + cache[key] = ways return ways From 7c6c6322bcaa4c4e99688df87b8ac983a821f396 Mon Sep 17 00:00:00 2001 From: Rihanna P <114884466+RihannaP@users.noreply.github.com> Date: Tue, 3 Mar 2026 23:06:04 +0000 Subject: [PATCH 2/3] Update 2 making_change.py --- .../making_change/making_change.py | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 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 9ffd0ba..c060549 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -1,45 +1,57 @@ -from typing import List -cache = {} -def ways_to_make_change(total: int) -> int: - """ - Given access to coins with the values 1, 2, 5, 10, 20, 50, 100, 200, returns a count of all of the ways to make the passed total value. - 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. - """ - +from typing import List, Dict, Tuple + +# Pre-create only 8 possible "coins" arrays +_BASE_COINS: List[int] = [200, 100, 50, 20, 10, 5, 2, 1] +COIN_SUFFIXES: List[Tuple[int, ...]] = [tuple(_BASE_COINS[i:]) for i in range(len(_BASE_COINS))] + +cache: Dict[Tuple[int, int], int] = {} + +def ways_to_make_change(total: int) -> int: cache.clear() - return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1]) + # suffix_id == 0 identifies [200, 100, 50, 20, 10, 5, 2, 1] + return ways_to_make_change_helper(total, suffix_id=0) -def ways_to_make_change_helper(total: int, coins: List[int]) -> int: +def ways_to_make_change_helper(total: int, suffix_id: int) -> int: """ - Helper function for ways_to_make_change to avoid exposing the coins parameter to callers. + suffix_id uniquely identifies the subarray coins = COIN_SUFFIXES[suffix_id] + where suffix_id in [0..7]. """ - key = (total, tuple(coins)) - + key = (total, suffix_id) if key in cache: return cache[key] - - if total == 0 or len(coins) == 0: + + coins = COIN_SUFFIXES[suffix_id] + + # Keep behavior close to original, but fix the standard base case: + if total == 0: + return 1 + if len(coins) == 0: return 0 - + if len(coins) == 1: - if total % coins[0] == 0: - return 1 - else: - return 0 - + cache[key] = 1 if (total % coins[0] == 0) else 0 + return cache[key] + 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 + # Instead of slicing coins[coin_index+1:], move the suffix_id forward. + # suffix_id is the start index of `coins` in the base list, so: + next_suffix_id = suffix_id + coin_index + 1 + if next_suffix_id < len(COIN_SUFFIXES): + ways += ways_to_make_change_helper(total - total_from_coins, suffix_id=next_suffix_id) + count_of_coin += 1 + cache[key] = ways return ways From 8a30741429e321ac44ba9404937d0f7d79b0ecd8 Mon Sep 17 00:00:00 2001 From: Rihanna P <114884466+RihannaP@users.noreply.github.com> Date: Wed, 4 Mar 2026 07:35:31 +0000 Subject: [PATCH 3/3] Update3 making_change.py --- .../making_change/making_change.py | 44 ++++++++----------- 1 file changed, 19 insertions(+), 25 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 c060549..8f412e0 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -1,42 +1,37 @@ from typing import List, Dict, Tuple -# Pre-create only 8 possible "coins" arrays +# Pre-create only _BASE_COINS: List[int] = [200, 100, 50, 20, 10, 5, 2, 1] -COIN_SUFFIXES: List[Tuple[int, ...]] = [tuple(_BASE_COINS[i:]) for i in range(len(_BASE_COINS))] cache: Dict[Tuple[int, int], int] = {} def ways_to_make_change(total: int) -> int: cache.clear() # suffix_id == 0 identifies [200, 100, 50, 20, 10, 5, 2, 1] - return ways_to_make_change_helper(total, suffix_id=0) + return ways_to_make_change_helper(total, start_index: 0) -def ways_to_make_change_helper(total: int, suffix_id: int) -> int: - """ - suffix_id uniquely identifies the subarray coins = COIN_SUFFIXES[suffix_id] - where suffix_id in [0..7]. - """ - key = (total, suffix_id) - if key in cache: - return cache[key] - - coins = COIN_SUFFIXES[suffix_id] - - # Keep behavior close to original, but fix the standard base case: +def ways_to_make_change_helper(total: int, start_index: int) -> int: if total == 0: return 1 - if len(coins) == 0: + + if start_index >= len(_BASE_COINS): return 0 - if len(coins) == 1: - cache[key] = 1 if (total % coins[0] == 0) else 0 + coin = _BASE_COINS[start_index] + + if start_index == len(_BASE_COINS) - 1: + return 1 if total % coin == 0 else 0 + + key = (total, start_index) + if key in cache: return cache[key] ways = 0 - for coin_index in range(len(coins)): - coin = coins[coin_index] + + for coin_index in range(start_index, len(_BASE_COINS)): + coin = _BASE_COINS[coin_index] count_of_coin = 1 while coin * count_of_coin <= total: @@ -45,11 +40,10 @@ def ways_to_make_change_helper(total: int, suffix_id: int) -> int: if total_from_coins == total: ways += 1 else: - # Instead of slicing coins[coin_index+1:], move the suffix_id forward. - # suffix_id is the start index of `coins` in the base list, so: - next_suffix_id = suffix_id + coin_index + 1 - if next_suffix_id < len(COIN_SUFFIXES): - ways += ways_to_make_change_helper(total - total_from_coins, suffix_id=next_suffix_id) + ways += ways_to_make_change_helper( + total - total_from_coins, + coin_index + 1 + ) count_of_coin += 1