summation f nを定義せよ
(define (summation-1 f n) (if (< n 0) 0 (+ (summation-1 f (- n 1)) (f n))))これは、ほとんどそのまんま。つまり、(summation f -i) を 0 と定義し、 その後は再帰的な定義にしたがって、n >= 0に対し
(summation-1 f n) = (+ (f n) (summantion-1 f (- n 1)))と記述したものである。
もう一つは、map と apply を用いたもの。
(define (enumerate-interval begin end) (if (> begin end) '() (cons begin (enumerate-interval (+ 1 begin) end)))) (define (summation-0 f n) (apply + (map f (enumerate-interval 0 n))))整数列発生器を用いて、 (0 ... n) を生成し、次に map を用いて f(n)のリストを生成し、 最後に + を適用したものである。
(define (flatten expr)
(if (list? expr)
(apply append (map flatten expr))
(list expr)))
fold f (x0 ... xn) b = (f x0 (f x1 (.... (f xn b)..)))
fold f () b = b
また、fold をもちいて length を定義せよ。
また、sum = 1 + ... + n, prod = 1 * ... * nも fold を用いて定義せよ。
(define (fold f expr b)
(if (null? expr)
b
(f (car expr) (fold f (cdr expr) b))))
(define (incB item b) (+ b 1))
(define (my-length expr) (fold incB expr 0))
また、 1 + .. + n がしたければ和の単位元 0 を初期値 b に設定し、
fとして + 演算を行えば良いのであり、
1 * .. * n がしたければ単位元 1 を初期値 b に設定し、
fとして * 演算を行えば良いだけである。
(define (my-sum expr) (fold + expr 0))
(define (my-prod expr) (fold * expr 1))
99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp