博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SICP学习笔记 2.1.2 抽象屏障
阅读量:4028 次
发布时间:2019-05-24

本文共 3858 字,大约阅读时间需要 12 分钟。

  练习2.2

(define (make-point x y)  (cons x y))(define (x-point p)  (car p))(define (y-point p)  (cdr p))  (define (make-segment m n)  (cons m n))(define (start-segment s)  (car s))(define (end-segment s)  (cdr s))  (define (midpoint-segment s)  (make-point (/ (+ (x-point (start-segment s))		             (x-point (end-segment s)))		         2.0)	            (/ (+ (y-point (start-segment s))		            (y-point (end-segment s)))		         2.0)))		 1 ]=> (print-point (midpoint-segment 			      (make-segment 			         (make-point 1 3) 				 (make-point 3 5))))(2,4)
 

   练习2.3

;; 平面矩形的构造函数和选择函数;; 构造函数, 使用两条线段构造平面矩形(make-rectangle	segment1 segment2);; 返回平面矩形相邻两边中左边的线段 (left-segment-rectangle rectangle);; 返回平面矩形相邻两边中右边的线段(right-segment-rectangle rectangle);; 根据构造函数和选择函数实现计算平面矩形周长的过程;; 首先实现计算线段长度的过程, 这里借用2.2中的关于线段和点的过程(define (segment-length segment)  (point-length (start-segment segment) (end-segment segment)))(define (point-length start end)  (sqrt (+ (square (- (x-point start) (x-point end)))	   			 (square (- (y-point start) (y-point end))))))	   ;; 然后实现计算平面矩形周长的过程(define (perimeter-rectangle rectangle)  (+ (* 2 (segment-length (left-segment-rectangle rectangle)))     (* 2 (segment-length (right-segment-rectangle rectangle)))))     ;; 对构造函数和选择函数做两种实现;; 平面矩形可以由相对(不在同一条直线上)的两个长度相同的平行线段构成, 这里没有对是否平行校验(define (make-rectangle	segment1 segment2)  (cons segment1 segment2))(define (left-segment-rectangle rectangle)  (car rectangle))(define (right-segment-rectangle rectangle)  (make-segment (start-segment (car rectangle))			  (start-segment (cdr rectangle))))		;; 验证(perimeter-rectangle 	(make-rectangle 		(make-segment (make-point 0 0)				        (make-point 3 0))		(make-segment (make-point 3 4)				        (make-point 6 4))));Value: 16;; 平面矩形可以由相交(起点相同且不在同一条直线上)的的两条线段构成, 这里没有对十分在同一条直线校验(define (make-rectangle	segment1 segment2)  (cons segment1 segment2))(define (left-segment-rectangle rectangle)  (car rectangle))(define (right-segment-rectangle rectangle)  (cdr rectangle))  ;; 验证(perimeter-rectangle 	(make-rectangle 		(make-segment (make-point 0 0)				        (make-point 3 0))		(make-segment (make-point 0 0)				        (make-point 3 4))));Value: 16;; 对于平面矩形的面积;; 首先实现点到直线距离的过程;; 点(x0, y0)到直线Ax+By+C=0的距离公式为|Ax0+By0+C|/√A^2+B^2;; 将直线方程变换为y=kx+b形式,得到距离公式为|kx0-y0+b|/√k^2+1(define (point-to-segment point segment)  (let ((fun (get-k-b segment)))    (/ (abs (+ (* (car fun) (car point))	       			 (- (cdr point))	       			 (cdr fun)))       (sqrt (+ (square (car fun)) 1)))));; k = (y1-y2)/(x1-x2);; b = y1-x1*k(define (get-k-b segment)  (let ((k (/ (- (cdr (start-segment segment))		    (cdr (end-segment segment)))	         (- (car (start-segment segment))	            (car (end-segment segment))))))    (cons k (- (cdr (start-segment segment))	        (* k (car (start-segment segment)))))))			 ;; 由此实现计算平面矩形面积的过程(define (area-rectangle rectangle)  (* (segment-length (left-segment-rectangle rectangle))     (point-to-segment (end-segment (right-segment-rectangle rectangle))		       			              (left-segment-rectangle rectangle))));; 由平行线段构造平面矩形验证计算面积的过程(define (right-segment-rectangle rectangle)  (make-segment (start-segment (car rectangle))			  (start-segment (cdr rectangle))))(area-rectangle (make-rectangle 			  (make-segment (make-point 0 0)					      	  (make-point 3 0))			  (make-segment (make-point 3 4)					      	  (make-point 6 4))));Value: 12;; 由相交线段构造平面矩形验证计算面积的过程(define (right-segment-rectangle rectangle)  (cdr rectangle))(area-rectangle (make-rectangle 			  (make-segment (make-point 0 0)					      	  (make-point 3 0))			  (make-segment (make-point 3 0)					      	  (make-point 6 4))))  ;Value: 12		;; 这里将平面矩形理解成了平行四边形,-_-!,不过尝试(area-rectangle (make-rectangle 			  (make-segment (make-point 0 0)					      	  (make-point 3 0))			  (make-segment (make-point 3 0)					      	  (make-point 3 4))))  ;; 也可以得到正确结果
 

 

转载地址:http://mavbi.baihongyu.com/

你可能感兴趣的文章
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
自己动手写GC
查看>>
10个精妙的Java编码最佳实践
查看>>
Java 8新特性终极指南
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>
JVM 线程堆栈分析过程详解
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
可扩展、高可用服务网络设计方案
查看>>
如何构建高扩展性网站
查看>>
微服务架构的设计模式
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++指针常量与常量指针详解
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++的string类初始化及其常用函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
STL::deque以及由其实现的queue和stack
查看>>