Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions Sprint-2/improve_with_caches/fibonacci/fibonacci.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
# Initialize the cache as a function attribute if it doesn't exist yet
if not hasattr(fibonacci, "cache"):
fibonacci.cache = {}

def helper(number):
# Check the function attribute cache at the start
if number in fibonacci.cache:
return fibonacci.cache[number]

# Base case
if number <= 1:
return number

# Compute the result (making sure number decreases!)
result = helper(number - 1) + helper(number - 2)

# Store the result in the function attribute cache right before returning
fibonacci.cache[number] = result
return result

return helper(n)
33 changes: 27 additions & 6 deletions Sprint-2/improve_with_caches/making_change/making_change.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,53 @@
from typing import List

# Defined once globally to avoid recreation overhead
COINS = [200, 100, 50, 20, 10, 5, 2, 1]


# ===============> change function <============
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.
"""
return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1])
# Initialize a cache dictionary
cache = {}
# Passing 0 (the starting index) instead of the full list
return ways_to_make_change_helper(total, 0, cache)


def ways_to_make_change_helper(total: int, coins: List[int]) -> int:
# =================> change helper function <==============
def ways_to_make_change_helper(total: int, start_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:
# Create unique key for this subproblem
cache_key = (total, start_index)

# Return cached result if already calculated
if cache_key in cache:
return cache[cache_key]

if total == 0 or start_index >= len(COINS):
return 0

ways = 0
for coin_index in range(len(coins)):
coin = coins[coin_index]
# Iterate through the global COINS list using the integer index
for i in range(start_index, len(COINS)):
coin = COINS[i]
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:])
# Just pass an integer (i + 1)
intermediate = ways_to_make_change_helper(
total - total_from_coins, start_index=i + 1, cache=cache
)
ways += intermediate
count_of_coin += 1

cache[cache_key] = ways
return ways
Loading