LecChap08-2

More About Recursion
Alice
A second form of recursion
A second form of recursion is used when
the solution to a problem depends on the
ability to break a problem down into
smaller and smaller sub-problems.
Let's look at an example…
A Towers Problem
Source
Spare
Target
(coneFrom) (coneSpare) (coneTo)
The challenge is to
move all the disks from
the source cone to the
target cone.
Move 1 disk at a time
A larger disk may
never be on top of a
smaller disk
Initial world
The disks are instances of the
Torus class. (A torus is a
doughnut shaped object.)
Each cone is positioned exactly
1 meter from its nearest
neighbor.
Other than the bottom disk,
each disk is positioned exactly
0.1 meter above the disk
below.
Identifying the disks
To make it easier to describe our solution, we
give each disk an id number and a name.
id number
1
2
3
4
name
disk1
disk2
disk3
disk4
Solving the problem
Our solution will use the
Principle of “wishful thinking”
assume we could solve a smaller version of the
same problem
if we could solve the smaller version, it would
make it easier to solve this problem.
Base case – the simplest possible
version of this problem, one that can
obviously be solved.
Wishful thinking in practice
Assume I could move 3 of the
disks to the spare cone.
Then I could move the 4th disk
(base case) to the target cone.
Storyboard
To solve the towers problem, we need to know howmany
disks we have and which cone is the source, the target,
and the spare:
World.towers:
Parameters: howmany, source, target, spare
If howmany is equal to 1
move it (the smallest disk) from the source to the target
Else
(1) call towers to move howmany-1 disks from source to spare
(using target as spare)
(2) move it (disk # howmany) from the source to the target
(3) call towers to move howmany-1 disks from the spare to the target
(using the source as the spare)
base case –
move 1 disk
a smaller problem -recursively move the
rest of the disks
towers
The base case occurs when howmany equals 1, just move the
disk.
Two recursive calls are used to solve the smaller problem
(moving howmany-1 disks), which helps us solve the bigger
problem (moving howmany disks).
Moving a disk
A challenge in this animation is how to move a
disk from one tower to another.
In the towers method, we assumed that we had
a method named moveIt that would accomplish
the task. To write the moveIt method, we need to
know:
What are the parameters to send in to our method?
What steps need to occur?
How high to raise the disk object?
How far (forward/back) to move it?
moveIt Storyboard
The parameters are:
whichdisk – the disk id number
fromcone – the source cone
tocone – the target cone
A storyboard describing the steps is:
moveIt:
Parameters: whichdisk, fromcone, tocone
Do in order
Lift the disk up above the top of the fromcone
Move it (forward or back) to a location above the tocone
Lower the disk down onto the tocone
Nested Ifs
The disk id number is
used to determine
which disk to
move up
move over
move down
This means that
nested Ifs must be
used three times!
(The code on this slide
is for just one move.)
Using an expression
We noticed that the distance each disk
has to move up (and then back down) is
0.3 meters more than 0.1 * the id number
(whichdisk).
We could use an expression to compute
the distance for the move up and move
down instructions.
move the appropriate disk 0.3 + 0.1 *whichdisk
Problem
The problem with this nifty math
expression is that we need to have the
disk's name to write a move instruction.
For example,
disk1 move up …
must be an object, cannot use the id number here
Using a question
We decided to write a question to convert the
disk id number (i) to the disk name.
moveIt
Demo!
Assignment
Read Chapter 8-2,
A Second Form of Recursion
Read Tips & Techniques 8,
Camera and Animation Controls
Lab 8-2