[Current] [News] [Glance] [Discussions] [Instructions] [Search] [Links] [Handouts] [Outlines] [Readings] [Labs] [Homeworks] [Quizzes] [Exams] [Examples] [Fall2000.01] [Spring2000]
Scan through the reading on recrusion.
Define and test a Scheme procedure product
that takes a list
of numbers as its argument and returns the result of multiplying them all
together. Warning: (product null)
should not be 0.
It should be the identity for multiplication, just as (sum
null)
is the identity for addition. Explain why.
Define and test a Scheme procedure square-each-element
that
takes a list of numbers as its argument and returns a list of their
squares.
> (square-each-element (list -7 3 12 0 4/5)) (49 9 144 0 16/25)
Hint: For the base case, consider what the procedure should return when given a null list; for the other case, separate the car and the cdr of the given list and consider how to operate on them so as to construct the desired result.
Define and test a Scheme procedure lengths
that takes a list
of lists as its argument and returns a list of their lengths:
> (lengths (list (list 'alpha 'beta 'gamma) (list 'delta) null (list 'epsilon 'zeta 'eta 'theta 'iota 'kappa))) (3 1 0 6)
Define and test a Scheme procedure named tally-skips
that
takes one argument, a list, and determines how many times the symbol
skip
occurs in the list.
Define and test a Scheme procedure named filter-out-skips
that
takes a list of symbols as its argument and returns a list that does not
contain the symbol skip
, but is otherwise identical to the
given list. (Use the predicate eq?
to test whether two
symbols are alike.)
> (filter-out-skips (list 'hop 'skip 'jump 'skip 'and 'skip 'again)) (hop jump and again)
The example illustrates the intended effect of the procedure. By itself,
however, it's not an adequate test of your procedure. It would be a good
idea to test the case in which the given list is empty, a case it which it
contains only skip
s, and one in which it contains only symbols
other than skip
. You might also test different positions
opf skip
: at the front, at the end, and in the middle.
I recommend that you test the procedures you create very thoroughly. In most cases, testing does not reveal any errors in your procedures; but finding and correcting the errors that testing exposes is one of the most productive and rewarding uses of a programmer's time.
Define and test a Scheme procedure named tally-occurrences
that takes two arguments, a symbol and a list of symbols, and determines
how many times the given symbol occurs in the given list.
Hint: Use direct recursion. Here are the questions that you must resolve: What is the base case? What value should the procedure return in that case? How can you simplify the problem in order to recursively invoke the procedure being defined? What do you need to do with the value of the recursive procedure call in order to obtain the final result?
> (tally-occurrences 'apple (list 'pear 'apple 'cranberry 'banana 'apple)) 2 > (tally-occurrences 'apple (list 'oak 'elm 'maple 'spruce 'pine))0
Write a Scheme procedure, num-odds
, that returns the
number of odd numbers in a list.
If you'd like to be extra careful, make sure that your procedure works correctly even if some of the values in the list are not numbers.
Write a Scheme procedure, odds
that, given a list,
produces another list that contains only the odd numbers in the
first list.
Write a Scheme procedure, closest-to-zero
that, given
a list of numbers (including both negative and positive nubmers),
returns the value closest to zero in the list.
Define and test a Scheme procedure named gaps
that takes
a non-empty list of real numbers as its argument and returns a list of
the disparities between numbers that are adjacent on the given list.
> (gaps (list 30 16 21 9 42)) (14 5 12 33)
Note that gaps always returns a list one element shorter than the one it is given.
Hint: What is the base case?
Define and test a Scheme predicate all-in-range?
that takes a
list as argument and determines whether all of its elements are in the
range from 0 to 100, inclusive.
Define and test a Scheme predicate element?
that takes two
arguments, a symbol and a list, and determines whether the given symbol is
an element of the given list.
Define and test a Scheme predicate, types
, that takes a
list as an argument and returns a list of the types of the individual
elements.
For example,
> (types '(34 a (1 2 3))) (number symbol list) > (types '()) () > (types '(a b c)) (symbol symbol symbol)
You may want to use your type
procedure from a previous
lab.
This problem is for extra credit.
Some of you have criticized the build-in length
method
for counting only the number of values in the top-level list. Write
a procedure, count-values
that counts the total number
of non-list values in a list or its sublists.
For example,
> (count-values '(a b c)) 3 > (count-values '()) 0 > (count-values '((1 2 3) (a b) ((2)))) 6 > (count-values '(() () () ())) 0
[Current] [News] [Glance] [Discussions] [Instructions] [Search] [Links] [Handouts] [Outlines] [Readings] [Labs] [Homeworks] [Quizzes] [Exams] [Examples] [Fall2000.01] [Spring2000]
Disclaimer Often, these pages were created "on the fly" with little, if any, proofreading. Any or all of the information on the pages may be incorrect. Please contact me if you notice errors.
This page may be found at http://www.cs.grinnell.edu/~rebelsky/Courses/CS151/2000F/Labs/recursion1.html
Source text last modified Wed Sep 13 10:50:27 2000.
This page generated on Wed Sep 13 10:50:32 2000 by Siteweaver. Validate this page's HTML.
Contact our webmaster at rebelsky@grinnell.edu