C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
This can continue forever, until stack space is exhausted. Ruby supports recursive methods.
Recursion example. Here we implement a method that determines all possible ways to count change for a certain amount. It does not find just one solution. It finds all solutions.
Change. This program requires two initial arrays: an array of coins (which is at first empty) and an array of amounts. The "amounts" array stores the number of cents each coin is worth.
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.
In change, important things happen. The coins array is copied into a "copy" array. We use the concat method for this, and then push our new value into the array.
So: By copying the coins array, each recursive call does not affect other calls. This is important for correct results.
Based on:
Ruby 2
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...



In the output, we see ways to make 51 cents. We can use 51 one-cent pieces. Or we can use 46-one cent pieces and 1 five-cent piece. If you run the program, the output has all possibilities.
And: The results are easy to verify. We simply check them all mentally and review our program logic.
SICP. This is a classic programming exercise. It is discussed in the book Structure and Interpretation of Computer Programs. It teaches us how to use recursion and brute-force algorithms.
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.
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.
Some thoughts. Many tutorials teach us how to use methods, variables, or objects. But teaching complex problem solving is harder. Solving problems is everything.
A review. With this example from the Structure and Interpretation of Computer Programs, we consider a problem that is not trivial. Yet many real-world problems are much more complex.