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

最新文章

  1. word中方框中打钩
  2. Java数据库——CallableStatement接口
  3. HTTP 协议的历史演变和设计思路
  4. 用java给php写个万能接口
  5. 3.25考试(hnoi难度)----神奇的一日游
  6. 利用Spring AOP自定义注解解决日志和签名校验
  7. C# DllImport的用法
  8. 在iframe中获取iframe外的对象
  9. eclipse 编辑 python 中文乱码的解决方案
  10. 查询一周最近一周的数据,date String 随意转换,更有疯狂的排序
  11. js 全国城市3级联动
  12. asp.net -mvc框架复习(4)-ASP.NET MVC中的约定规则
  13. asp.net core如何自定义端口/修改默认端口
  14. 禁ping以及清理系统多余账号说明
  15. sql Server 创建临时表 嵌套循环 添加数据
  16. spring AOP AspectJ 定义切面实现拦截
  17. 使用线程操作刷新Winform界面
  18. [尝鲜]妈妈再也不用担心 dotnet core 程序发布了: .NET Core Global Tools
  19. Python练习1
  20. FineReport连接多维数据库示例及操作

热门文章

  1. AI人脸识别SDK接入 — 参数优化篇(虹软)
  2. Python学习日记(六) 浅深copy
  3. grpc的简单用例 (golang实现)
  4. 关于linux的档案随笔
  5. 那些可作为GC Roots的对象
  6. linux系统编程之信号(六)
  7. ifram 调用父页面的easyui弹框
  8. 织梦xss通杀所有版本漏洞【学习笔记】
  9. 记录一下使用swiper遇到的坑
  10. java利用反射动态获取实体类的属性值