《sicp》模块化程序设计
2.2.3 序列作为一种约定界面 学习笔记
这节中,讲述了一种模块化的程序设计思想,也就是将程序设计为如同信号处理过程一样,采用级联的方式将程序各个部分组合在一起,程序的每一部分对应于一个处理过程,并通过约定的界面将程序各个部分连接在一起.在本节中将序列作为一种约定界面.
实例
给定自然数n,找到所有的有序队i和j (i,j小于等于n大于等于0) ,其中i小于j , 使得i+j为素数.
分析
如采用模块化设计,可以将程序分为以下几个部分
1.列出所有的有序对,并用序列组织起来
2.过滤掉序列中不满足和为素数的有序对.
3.将序列中每个序队的和添加进序对组成三元组,输出最后结果
1.生成所有有序对
生成方法:对每个i小于等于n,枚举出所有的整数 j小于i ,并对每一对i和j生成序对 (i,j).
(define ( accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence) (accumulate op initial (cdr sequence)) )
)
)
(define (emuerate-interval low high)
(if (> low high)
'()
(cons low (emuerate-interval (+ low 1) high))
)
)
(define (unique-pairs n)
(accumulate append '()
(map (lambda (x)
(map (lambda (y) (list x y ))
(emuerate-interval 1 (- x 1) )
)
)
(emuerate-interval 1 n) )
)
)
2.过滤序列
过滤模板程序
(define (filter predicate sequence)
(cond ((null? sequence) '())
((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr sequence))))
(else (filter predicate (cdr sequence)))
)
)
(define (prime-sum? pair)
(prime? (+ (car pair) (cadr pair)))
)
3.组合结果
(define (make-pair-sum l)
(map (lambda (pair) (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) l )
)
最终程序
(define (prime-sum-pairs n)
(make-pair-sum
(filter prime-sum?
(unique-pairs n))
)
)