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

《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))
 )
)
posted @   battzion  阅读(248)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示