《sicp》模块化程序设计 笔记

时间:2021-04-15 22:25:07

《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))
 )
)