Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
020ef11
create/define a dict that acts as my cache
HassanOHOsman Feb 27, 2026
9687e70
Update "Fibonacci" function to cache results when n <= 1 before retur…
HassanOHOsman Feb 27, 2026
80bbd88
Update "Fibonacci" function to cache results when n > 1 before return…
HassanOHOsman Feb 27, 2026
870d1b9
place cache outside the function otherwise it wont' store pairs as it…
HassanOHOsman Feb 27, 2026
b5802e9
return the cache in both conditions instead, so that it can be read from
HassanOHOsman Feb 27, 2026
1429f7d
revert to the initial returns in both conditions to avoid bugs
HassanOHOsman Feb 27, 2026
2cf7251
expand fibonacci function to handle when a key is already stored and …
HassanOHOsman Feb 27, 2026
d85aec6
Define cache dictionary for memoising results of total and coin inputs
HassanOHOsman Feb 28, 2026
7477e9d
Create a cache key from the current total and available coins
HassanOHOsman Feb 28, 2026
fa897c1
assigned the calcuated value (ways) to the cache key (key)
HassanOHOsman Feb 28, 2026
6f1f754
Save the number of ways (the result) so that next time we see this sa…
HassanOHOsman Feb 28, 2026
0e824bb
Replace the code line that repeatedly creates the same sub-arrays. Us…
HassanOHOsman Mar 3, 2026
a771cf7
update hepler function argument from coin to coin_index to uniquely i…
HassanOHOsman Mar 3, 2026
6ebb9f6
Update the return of function "ways_to_make_change"
HassanOHOsman Mar 3, 2026
ba0d360
Use coin index instead of coins tuple in cache key
HassanOHOsman Mar 3, 2026
910f67e
update all reference to "coin" with "coins" the new hardcoded list
HassanOHOsman Mar 3, 2026
2d527ae
remove the for loop inside the helper function
HassanOHOsman Mar 3, 2026
08f9869
updat the while lopp inside the helper function
HassanOHOsman Mar 3, 2026
716d81f
Add cache lookup insde the helper function
HassanOHOsman Mar 3, 2026
994ee9f
Add base case to return 1 when total is 0
HassanOHOsman Mar 3, 2026
4570e98
Fix while loop condition in helper to correctly iterates
HassanOHOsman Mar 3, 2026
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
11 changes: 10 additions & 1 deletion Sprint-2/improve_with_caches/fibonacci/fibonacci.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
cache = {}

def fibonacci(n):
if n in cache:
return cache[n]

if n <= 1:
cache[n] = n
return n
return fibonacci(n - 1) + fibonacci(n - 2)

result = fibonacci(n - 1) + fibonacci(n - 2)
cache[n] = result
return result
48 changes: 27 additions & 21 deletions Sprint-2/improve_with_caches/making_change/making_change.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,38 @@
from typing import List

coins = [200, 100, 50, 20, 10, 5, 2, 1]
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • If this is to be used as a constant, best practice is to name it with all uppercase letters.

  • We could also keep the coins array in the parameter. Arrays are pass by reference to a function so the overhead is negligible.


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.
"""
return ways_to_make_change_helper(total, [200, 100, 50, 20, 10, 5, 2, 1])
return ways_to_make_change_helper(total, 0)


def ways_to_make_change_helper(total: int, coin_index :int) -> int:
key = (total, coin_index)

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:
if key in cache:
return cache[key]

if total == 0:
return 1


if coin_index == len(coins):
return 0
Comment on lines +15 to 23
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: Even though key construction and dictionary lookup are O(1) operations, they are still relatively costly than some simple numerical computation or comparisons (code on lines 18 and 22).

This is unrelated to cache, but if you swap the code on lines 18-23 with the code on lines 13-16, you can probably notice some slight improvement in performance.


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

coin = coins[coin_index]
count_of_coin = 0
while count_of_coin * coin <= total:
ways += ways_to_make_change_helper(
total - count_of_coin * coin,
coin_index + 1
)
count_of_coin += 1

cache[key] = ways

return ways