sicp每日一题[2.3]
Exercise 2.3
Implement a representation for rectangles in a plane. (Hint: You may want to make use of Exercise 2.2.) In terms of your constructors and selectors, create procedures that compute the perimeter and the area of a given rectangle. Now implement a different representation for rectangles. Can you design your system with suitable abstraction barriers, so that the same perimeter and area procedures will work using either representation?
首先借用 Exercise 2.2 的函数来表示矩形,我们已经有了线段的表示方法,那矩形就是2组平行且相等的线段,且邻边垂直。为了简单起见,把矩形左下角的顶点坐标设为(0, 0),且一条边落在 x 轴上。然后采用矩形左边的那条边和对角线交点坐标来确定一个矩形,同样为了简便起见,把交点坐标设为(0, 0)。可以看出 make-point, x-point, y-point; make-segment, start-segment, end-segment; make-rect, make-rect-by-meeting-point; get-line-length, get-perimeter, get-area 是四层不同的函数,某一层的函数实现逻辑的改变,不会影响到其他层的调用。
; 用左下的顶点和经过该顶点的两条邻边来确定一个矩形,为简单起见,左下的顶点坐标设为(0, 0)
; length, width 分别表示矩形的长和宽
(define (make-rect length width)
(let ((left-bottom (make-point 0 0)))
(cons (make-segment left-bottom (make-point (car left-bottom) (+ (cdr left-bottom) width))) ; 竖直的那条边
(make-segment left-bottom (make-point (+ (car left-bottom) length) (cdr left-bottom)))))) ; 水平的那条边
; 用矩形的对角线交点和左边的边来确定一个矩形,为简单起见,对角线交点坐标设为(0, 0)
; left-line 表示左边的边
(define (make-rect-by-meeting-point left-line)
(cons left-line (make-segment (start-segment left-line) (make-point (- 0 (x-point (start-segment left-line)))
(y-point (start-segment left-line))))))
; 用两点间距离公式 d = sqrt(x^2 + y^2) 计算线段的长度
(define (get-line-length segment)
(sqrt (+ (square (- (x-point (end-segment segment))
(x-point (start-segment segment))))
(square (- (y-point (end-segment segment))
(y-point (start-segment segment)))))))
; 计算矩形的周长
(define (get-perimeter rect)
(* 2 (+ (get-line-length (car rect))
(get-line-length (cdr rect)))))
; 计算矩形的面积
(define (get-area rect)
(* (get-line-length (car rect))
(get-line-length (cdr rect))))
; 设置一个长为7宽为5的矩形
(define test-rect1 (make-rect 7 5))
(display "矩形test-rect1周长为:")
(display (get-perimeter test-rect1))
(newline)
(display "矩形test-rect1面积为:")
(display (get-area test-rect1))
(newline)
; 设置一个长为7宽为5的矩形
(define A (make-point -3.5 -2.5))
(define B (make-point -3.5 2.5))
(define left-line (make-segment A B))
(define test-rect2 (make-rect-by-meeting-point left-line))
(display "矩形test-rect2周长为:")
(display (get-perimeter test-rect2))
(newline)
(display "矩形test-rect2面积为:")
(display (get-area test-rect2))
(newline)
; 执行结果
矩形test-rect1周长为:24.000000282646763
矩形test-rect1面积为:35.00000070672435
矩形test-rect2周长为:24.000000282646763
矩形test-rect2面积为:35.00000070672435
sicp每日一题[2.3]的更多相关文章
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170104
20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170103
20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20161230
// 20161229问题解析请点击今日问题下方的"[Java每日一题]20161230"查看(问题解析在公众号首发,公众号ID:weknow619)package Dec2016 ...
- 【Java每日一题】20161229
package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1229 { public s ...
- 【Java每日一题】20161228
package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1228 { public s ...
- 【Java每日一题】20161227
package Dec2016; public class Ques1227 { public static void main(String[] args){ } { c = 1; } int c ...
- 【Java每日一题】20161226
package Dec2016; public class Ques1226 { static{ num = 1; } public static int num = 2; public static ...
- 【Java每日一题】20161223
package Dec2016; public class Ques1223 { public static void main(String[] args){ Integer obj = Integ ...
随机推荐
- Spring5.X的注解配置项目
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- Pypi配置API Token
技术背景 在许久之前写的一篇博客中,我们介绍过使用twine向pypi上传我们自己的开源包的方法.最近发现这个方法已经不再支持了(报错信息如下所示),现在最新版需要使用API Token进行文件上传, ...
- Java-继承Thread的方式和实现Runnable接口多线程
继承Thread的方式实现多线程 public class TestThread extends Thread{ @Override public void run() { System.out.pr ...
- webpack4.15.1 学习笔记(一) — 基本概念
目录 入口(entry) 出口(output) 加载器 Loaders 插件 Plugins 模式 webpack.config.js 配置 终终终终于下定决心,对你下手了,系统的学习一下. webp ...
- oeasy 教您玩转linux 之010208 满屏乱码 bb
我们来回顾一下 上一部分我们都讲了什么? 黑客帝国 各种速度颜色参数 最后我们想找一个让人完全崩溃的软件包,这不就来了,话不多说,先试试. apt show bbapt search bbsudo a ...
- oeasy教您玩转vim - 8 - # 追加文本
追加文本 回忆上节课内容 我们这次深入了 i 命令 i 在当前的光标之前插入 I 在本行文本的最前面插入 还有一些常用的编辑命令 . 重做 u 撤销 ctrl+r 还原 关于插入,还有什么讲究吗? 类 ...
- Figma数值输入框支持拖拽调整功能实现
最近再研究Figma的一些功能设计, 对其中的数值输入框可以直接鼠标拖拽的这个设计印象非常深刻. 这里用了其他网友的一张动态截图演示一下效果. 实际这个拖拽的功能不止看到的这么简单, 在深度研究使用之 ...
- JuiceFS 直连 NFS 新功能介绍,赋能 NAS 进行 AI 训练
NAS 通过提供多用户网络数据存取服务,极大地简化了数据共享和管理.而 NFS 作为实现这种共享的一种主流协议,尽管广泛应用,但在处理复杂的 AI 训练场景时常常受限于其性能和一致性问题. Juice ...
- SQL分析“聚集索引、非聚集索引”区别
概述 聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序,因此一 ...
- 使用uWSGI+nginx部署Django项目(Ubuntu)
对于uwsgi+nginx的部署方式,它的访问关系大概是: 1 the web client <-> the web server <-> the socket <-&g ...