More About Recursion Alice. A second form of recursion A second form of recursion is used when the...

Preview:

Citation preview

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

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

Source Spare Target

(coneFrom) (coneSpare) (coneTo)

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 name

1 disk1

2 disk2

3 disk3

4 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.

StoryboardTo 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 StoryboardThe 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 IfsThe 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 questionWe 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

Recommended