有一个很简单的问题:对0到n的整数中的偶数的斐波那契数求和。
不对它进行高级抽象的话,问题应该是这样解决的:
Scheme代码:
(define (even_fib n)
(define (even_fib_it m re)
(if (= m n)
(+ re (fib m))
(even_fib (+ m 1) (+ re (fib m)))))
(even_fib_it 0 0))
在SICP中研究的是对过程抽象解决问题,所以我们可以把它抽象为一类过程:
对要处理对象的枚举(enumerate)———对要处理对象的筛选(filter)———对对象的处理(map)———对处理后对象的累加(accumulate)
将其抽象为这一类问题的四个普适过程:
Scheme代码:
枚举(enumerate):
> (define (enumerate m)
(cond ((null? m) '())
((not (pair? m)) (list m))
(else
(append (enumerate (car m)) (enumerate (cdr m))))))
筛选(filter):
>(define (filter? proc m)
(cond ((null? m)
'())
((null? (cdr m))
(if (proc m)
(cons m '())
'()))
(else
(if (proc (car m))
(cons (car m) (filter proc (cdr m)))
(filter proc? (cdr m))))))
处理(map):
> (define (map proc m)
(cond ((null? m) '())
((null? (cdr m)) (cons (proc (car m)) '()))
(else
(cons (proc (car m)) (map proc (cdr m))))))
累加(accumulate):
> (define (accumulate m)
(if (null? (cdr m))
(car m)
(+ (car m) (accumulate (cdr m)))))
那么这种模块化后的过程将解决一系列相似过程中的问题。
那么抽象后的Scheme代码:
> (define (even_fibs n)
(accumulate
(map fib
(fliter
(enumerate n)))))