# Class 07: Recursion with Lists

Back to Conditionals Lab. On to Recursion with Numbers.

Held: Wednesday, 29 January 2003

Summary: Today we investigate recursion over lists with a number of experiments.

Related Pages:

Assignments:

Notes:

• What happens if an `if` lacks a false-part, as in `(if (< x 0) x)`?
• Any comments on the EBoards?
• I hope to return Lab writeup 1 to you on Friday.

Overview:

## Patterns of Recursion in Lists

• I find it useful to think about the pattern one uses to design certain kinds of procedures.
• Here's the pattern of a typical recursive procedure:
```(define proc
(lambda (val)
(if (base-case-test)
(base-case val)
(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 somewhat simpler:
```(define proc
(lambda (lst)
(if (null? lst)
null-case
(combine (onestep (car val))
(proc (cdr val))))))
```
• You may even find that there are some boolean procedures that don't even need an `if`. For example, here's one implementation of member that works on the principle that `val` is a member of `lst` if the list is not empty and `val` is the first element of `lst` or `val` is a member of the remainder of `lst`.
```(define member?
(lambda (val lst)
(and (not (null? lst))
(or (equal? val (car lst))
(member? val (cdr lst))))))
```

## Designing Case Cases

• The biggest problem I see in recursive procedure design is the choice of base case.
• If it returns numbers, your base case should be a number.
• If it returns lists, your base case should be a list (often null).
• If it returns some other type of value, your base case should be that type of value.
• You should also make sure to have a base case. (Scheme is funny when you don't return a value and then try to use it.)

## History

Thursday, 14 January 2003 [Samuel A. Rebelsky]

• Created as a mostly-blank outline.

Wednesday, 29 January 2003 [Samuel A. Rebelsky]

• Filled in the body (automatically).

Back to Conditionals Lab. On to Recursion with Numbers.

Disclaimer: I usually create these pages on the fly, which means that I rarely proofread them and they may contain bad grammar and incorrect details. It also means that I tend to update them regularly (see the history for more details). Feel free to contact me with any suggestions for changes.

This document was generated by Siteweaver on Tue May 6 09:20:21 2003.
The source to the document was last modified on Wed Jan 29 09:37:35 2003.
This document may be found at `http://www.cs.grinnell.edu/~rebelsky/Courses/CS153/2003S/Outlines/outline.07.html`.

You may wish to validate this document's HTML ; ; Check with Bobby

Samuel A. Rebelsky, rebelsky@grinnell.edu