This outline is also available in PDF.
Held: Friday, 29 February 2008
We begin our exploration of recursion, the most general form
of repetition available in Scheme. You can use recursion to both build
and iterate over different kinds of values. Today, we explore how you
use recursion to build simple numeric values from lists, and how to
remove elements from lists.
- Are there questions on Assignment 6?
- Are there questions in preparation for the quiz?
- We'll do things in a slightly different order today: I'll chat for a few minutes about the topic, then you'll take the quiz, then you'll do the lab.
- The idea of recursion.
- A sample recursive procedure:
- Another example: Filtering.
- You may recall that when we first considered algorithms we identified
a number of key aspects of algortihms:
- variables: the ability to name things;
- conditions: the ability to choose between things;
- procedures: the ability to name (and parameterize)
collections of steps;
- repetition: the ability to do something multiple times;
- input and output: the ability to get and report
- We've already seen how to do all of these things.
- Examples of repetition from baking:
- Stir the mix 50 times
- Knead the bread dough until it feels like your earlobe
- Bake until golden-brown.
- Examples of repetition from mathematics:
- Sum these values
- Find the smallest of these values
- Examples of repetition from everyday life:
- Naively find a name in the phone book
- Do I have a CD by Van Morrison?
- Examples of repetition from previous Scheme exercises:
- How long is this list?
- Is X a member of this list?
- We know a few ways to repeat actions:
- Using lists;
- Using images:
- Today we begin to consider more general forms of recursion.
- In Scheme, the most common mechanism for repetition is
- To do something that involves repeated actions, you
- Do one action
- Repeat the rest
- Combine the results if necessary.
- For example, to stir your cake mix 50 times, you stir it one time
and then stir it 49 more times.
- More generally, to stir a cake mix n times, you stir it one
time and then n-1 more times.
- Similarly, to knead dough until its the right consistency, you
knead it a little, check the consistency, and, if it's not the
right consistency, knead it until its the right consistency.
- In the case of mathematics, to sum a list we might add the
first value to the sum of the remaining values (or add the
last value to the sum of the initial values).
- There are a few key aspects to recursive design:
- You need to know when you're done (and what to do when you're done).
This aspect of recursive design is called the base case.
- You need to know what to do when you're not done. Here, you should
do a little, try again, and then perhaps combine the results.
This aspect of recursive design is called the recursive case.
- You need to be sure that you're getting closer to the base case
(otherwise you'll never stop).
- Here's the form of a typical recursive procedure:
(combine (partof val)
(proc (update val))))))
- When the value you're working with is a list and your base case
is the null list, the form is
(if (null? lst)
(combine (onestep (car val))
(proc (cdr val))))))