C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Change: This is the recursive method. It first checks whether we have reached our goal amount. It tries to add coins and then calls itself.
Display: This method loops through the coins that were added. It then computes the total and displays it.
So: By copying the coins array, each recursive call does not affect other calls. This is important for correct results.
Ruby program that uses recursive method
def change(coins, amounts, highest, sum, goal)
# Display result if we have correct change.
if sum == goal
display(coins, amounts)
end
# Return if we have too much money.
if sum > goal
return
end
# Loop over coin amounts and try adding them.
amounts.each do |value|
if value >= highest
# Copy the coins array, add value to it.
copy = Array[]
copy.concat coins
copy.push(value)
# Recursive call: add further coins if needed.
change(copy, amounts, value, sum + value, goal)
end
end
end
def display(coins, amounts)
# Display all the coins.
amounts.each do |amount|
count = 0
coins.each do |coin|
if coin == amount
count += 1
end
end
print amount, ": ", count, "\n"
end
print "\n"
end
# Specify our starting coins and all coin amounts.
coins = Array[]
amounts = Array[1, 5, 10, 25, 50]
# Make change for 51 cents.
change(coins, amounts, 0, 0, 51)
Output: truncated
1: 51
5: 0
10: 0
25: 0
50: 0
1: 46
5: 1
10: 0
25: 0
50: 0
1: 41
5: 2
10: 0
25: 0
50: 0
1: 41
5: 0
10: 1
25: 0
50: 0...
And: The results are easy to verify. We simply check them all mentally and review our program logic.
Also: With just a single loop, and no recursion, this is a much harder problem to solve. We need to branch out and test all possibilities.
Quote: More generally, can we write a procedure to compute the number of ways to change any given amount of money? This problem has a simple solution as a recursive procedure (SICP).