From db6c6f42ddc396c0cccab599a4e84fcf68c9bf7b Mon Sep 17 00:00:00 2001 From: shreefAhmedM Date: Wed, 14 Oct 2026 16:53:33 +0100 Subject: [PATCH 1/2] Speed up the solutions by introducing a cache --- .../fibonacci/fibonacci.py | 16 +++- .../making_change/making_change.py | 74 +++++++++++++------ 2 files changed, 65 insertions(+), 25 deletions(-) diff --git a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py index 60cc6671..0e8669a6 100644 --- a/Sprint-2/improve_with_caches/fibonacci/fibonacci.py +++ b/Sprint-2/improve_with_caches/fibonacci/fibonacci.py @@ -1,4 +1,14 @@ def fibonacci(n): - if n <= 1: - return n - return fibonacci(n - 1) + fibonacci(n - 2) + cache = {} + + def fib(n): + if n <= 1: + return n + + if n in cache: + return cache[n] + + cache[n] = fib(n - 1) + fib(n - 2) + return cache[n] + + return fib(n) \ No newline at end of file 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..3f1efe9c 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -2,31 +2,61 @@ 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. + coins = [200, 100, 50, 20, 10, 5, 2, 1] + cache = {} - 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]) + def helper(remaining: int, coin_index: int) -> int: + if remaining == 0: + return 1 + + if remaining < 0 or coin_index == len(coins): + return 0 + + key = (remaining, coin_index) + + if key in cache: + return cache[key] + + result = ( + helper(remaining - coins[coin_index], coin_index) + + helper(remaining, coin_index + 1) + ) + + cache[key] = result + return result + + if total < 0: + return 0 + + return helper(total, 0) 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. - """ - if total == 0 or len(coins) == 0: + cache = {} + + def helper(remaining: int, coin_index: int) -> int: + if remaining == 0: + return 1 + + if remaining < 0 or coin_index == len(coins): + return 0 + + key = (remaining, coin_index) + + if key in cache: + return cache[key] + + result = ( + helper(remaining - coins[coin_index], coin_index) + + helper(remaining, coin_index + 1) + ) + + cache[key] = result + return result + + + + if total < 0: return 0 - 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 - return ways + return helper(total, 0) \ No newline at end of file From d4f06d36a4fdf8224f4179e1a59c0a328dcee3d6 Mon Sep 17 00:00:00 2001 From: shreefAhmedM Date: Fri, 16 Oct 2026 17:18:37 +0100 Subject: [PATCH 2/2] refactoring the code --- .../making_change/making_change.py | 81 +++++++++---------- 1 file changed, 36 insertions(+), 45 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 3f1efe9c..bdb97a4d 100644 --- a/Sprint-2/improve_with_caches/making_change/making_change.py +++ b/Sprint-2/improve_with_caches/making_change/making_change.py @@ -1,62 +1,53 @@ + from typing import List +# Define coin values globally +COIN_VALUES = [200, 100, 50, 20, 10, 5, 2, 1] -def ways_to_make_change(total: int) -> int: - coins = [200, 100, 50, 20, 10, 5, 2, 1] - cache = {} - def helper(remaining: int, coin_index: int) -> int: - if remaining == 0: - return 1 +def ways_to_make_change(total: int) -> int: + """ + Given coin values of 1, 2, 5, 10, 20, 50, 100, and 200, + return the number of ways to make the given total. + """ + memo = {} + return change_helper(total, 0, memo) - if remaining < 0 or coin_index == len(coins): - return 0 - key = (remaining, coin_index) +def change_helper(amount: int, index: int, memo: dict) -> int: + """Helper function to calculate the number of ways.""" - if key in cache: - return cache[key] + key = (amount, index) - result = ( - helper(remaining - coins[coin_index], coin_index) - + helper(remaining, coin_index + 1) - ) + if key in memo: + return memo[key] - cache[key] = result - return result + if amount == 0: + return 1 - if total < 0: + if index >= len(COIN_VALUES): return 0 - return helper(total, 0) - - -def ways_to_make_change_helper(total: int, coins: List[int]) -> int: - cache = {} - - def helper(remaining: int, coin_index: int) -> int: - if remaining == 0: - return 1 + result = 0 - if remaining < 0 or coin_index == len(coins): - return 0 + for position in range(index, len(COIN_VALUES)): + value = COIN_VALUES[position] + quantity = 1 - key = (remaining, coin_index) + while value * quantity <= amount: + current_sum = value * quantity - if key in cache: - return cache[key] + if current_sum == amount: + result += 1 + else: + remaining = change_helper( + amount - current_sum, + position + 1, + memo + ) + result += remaining - result = ( - helper(remaining - coins[coin_index], coin_index) - + helper(remaining, coin_index + 1) - ) - - cache[key] = result - return result - - - - if total < 0: - return 0 + quantity += 1 - return helper(total, 0) \ No newline at end of file + memo[key] = result + return result