SICP Exercise 1.32
Question
Show that sum
and product
(exercise 1.31) are both special cases of a still more general notion called accumulate
that combines a collection of terms, using some general accumulation function:
(accumulate
combiner null-value term a next b)
accumulate
takes as arguments the same term and range specifications as sum
and product
, together with a combiner
procedure (of two arguments) that specifies how the current term is to be combined with the accumulation of the preceding terms and a null-value
that specifies what base value to use when the terms run out.
Write accumulate
and show how sum
and product
can both be defined as simple calls to accumulate
.
Answer
(define (accumulate combiner null-value term a next b)
(if (> a b) null-value
(combiner (term a) (accumulate combiner null-value term (next a) next b))))
(define (sum term a next b)
(accumulate + 0 term a next b))
(define (product term a next b)
(accumulate * 1 term a next b))
(define (identity x) x)
(sum identity 1 inc 10)
(product identity 1 inc 6)
The results are as expected:
55
720