Lecture 18
Recursion Review
We follow four basic steps when we think about recursion:
- Define an interface with all of the methods that both base case and recursive case
classes must implement.
- Define one or more classes representing base cases. Make sure that all methods from
the interface are implemented. Convince yourself that the constructors and methods work correctly.
- Define the constructors for recursive classes. Recursive calls of the constructor
should only create objects that are simpler than the one being built by the constructor.
Similarly, instance variables whose types are either the interface or class should only
refer to objects simpler than the one being constructed. In particular, the construction
of simpler objects in the constructor body should eventually end up at a base case.
Convince yourself that the constructor will be correct under the assumption that the
construction of simpler objects is correct.
- Write each method under the assumption that it works correctly on all simpler objects.
Convince yourself that the methods will be correct under the assumption that instance
variables hold simpler objects.
More Recursion
We looked at another recursion example where we had more than one recursively defined object
in our recursive case. In the broccoli example, a broccoli part consisted of a stem, and three
smaller broccoli parts. We handle them in the obvious way, and make sure to account for all
of them when defining our contains and move methods.
The class example
Broccoli
Next, we added some animation to our broccoli example. Instead of recursively calling
the constructor from the constructor, we called from the run method after
and appropriate pause. This slowed down the process of drawing the broccoli so that
we could see the recursion in process.
The class example
LivingBroccoli
Then we combined the ideas of recursion and animation to create our
ChainReaction
program.
This program recursively defined a list data structure as the first item on the list,
and the rest of the list. We used two while loops in the run method. The outer
loop selected the next ball off the list, and the inner loop animated the selected ball.
Finally, we looked at the
Powers program.
Here, we used a recursive definition to raise a base to a power.