`
SavageGarden
  • 浏览: 223146 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SICP学习笔记 2.1.2 抽象屏障

    博客分类:
  • SICP
 
阅读更多

  练习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))))  
;; 也可以得到正确结果
 

 

分享到:
评论

相关推荐

    SICP(计算机体系结构)

    - **2.1.2 抽象屏障**: 讨论数据抽象的边界问题。 - **2.1.3 数据的本质**: 深入探讨数据的概念。 - **2.1.4 扩展练习:区间算术**: 通过一个具体的案例来巩固所学知识。 - **2.2 层次数据与闭包属性** - **...

    SICP(python中文带书签)

    在Python中实现SICP的挑战在于,Python的语法和Lisp有很大区别,但这也为学习者提供了思考不同编程范式的机会。例如,Python的面向对象特性可以用来模拟SICP中的一些过程抽象,而Lisp中的动态作用域在Python中需要...

    SICP 解题集

    7. **模块化与系统构造**:如何组织和构建大型系统是SICP的一个重要方面,读者将学习如何使用组合和抽象来构建模块化的软件。 8. **复杂数学应用**:SICP中的一些习题涉及到数学概念,如傅里叶变换、数字信号处理等...

    sicp 2016 from

    - **抽象屏障 (Abstraction Barriers)**:强调了通过抽象屏障隔离实现细节的重要性。 - **何谓数据 (What Is Meant by Data?)**:探讨了数据的含义以及数据类型的重要性。 - **扩展练习:区间算术 (Extended ...

    sicp_notes:SICP笔记和练习

    《SICP笔记和练习》是一份详尽的资源,主要涵盖了由MIT教授们编写的经典计算机科学教材《Structure and Interpretation of Computer Programs》(简称SICP)的学习笔记和练习解答。这份资料以HTML格式呈现,便于在线...

    sicp in python 中文 sicp 中文

    sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh

    sicp 2.2.4节图形语言

    在这一章,读者会学习如何用基本的几何形状构建出复杂的图形,并理解如何通过组合和抽象来实现图形变换。这些变换包括平移、旋转、缩放等,它们都是通过定义和应用函数来实现的。这不仅揭示了函数式编程的优雅,也...

    Python SICP epub版本

    Python SICP epub版本,很适合学习抽象的思想,用Python版本比lisp更实用

    a_book_sicp_py

    3. 计算机科学的基础概念:《计算机科学的构造与解释》(SICP)一书涵盖了计算机科学的基础概念,例如程序的解释、计算过程和数据抽象。这些概念是构建更高级抽象和理解计算机如何操作数据的基石。 4. 使用函数构建...

    SICP中文第二版

    SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版

    SICP习题解答,主要第一章的内容习题答案

    本资料集包含了对SICP第一章习题的解答,旨在帮助学习者巩固基础,深化对函数式编程的理解。 首先,让我们关注一下习题解答中的几个关键部分: 1. **1.6.ss**: 这部分可能涉及到函数定义、递归和过程抽象。SICP的...

    sicp 2nd 英文chm

    3. **抽象**:SICP提倡通过创建抽象层来提高代码的可读性和复用性。通过定义新类型和操作,读者可以学习如何构建模块化的程序。 4. **数据结构**:书中的例子涵盖了各种数据结构,如列表、队列、栈和树。这些结构在...

    sicp-Structure and Interpretation of Computer Programs

    SICP不仅在MIT内部被广泛用作教学材料,而且在全球范围内也享有极高的声誉,被视为学习计算机科学理论基础的必读之作。 #### 二、书籍内容概览 SICP的内容涵盖了程序设计的基本概念、过程抽象、数据抽象、模块化...

    SICP LISP AI

    4. **数据结构和抽象**:SICP介绍了各种数据结构,如列表、树和队列,以及如何使用递归和高阶函数来操作它们。此外,还讨论了如何通过抽象隐藏实现细节,提高代码的复用性和可维护性。 5. **控制结构和计算的表示**...

    SICP 习题答案

    《计算机程序的构造和解释》(SICP)是一本极具影响力的计算机科学教材,由Harold Abelson和Gerald Jay Sussman所著,MIT出版社出版。这本书以其深入探讨编程概念、程序设计方法以及计算机系统的工作原理而闻名。1-3...

    Structure Interpration of Computer Programs(英文版)

    - **2.1.2 抽象屏障**:探讨抽象屏障的概念,即如何通过封装来隐藏数据的实现细节。 - **2.1.3 数据的含义是什么?**:深入讨论数据的本质及其在计算机科学中的作用。 - **2.1.4 扩展练习:区间算术**:通过区间...

    北京大学,计算机程序构造和解释(SICP)课件,裘宗燕老师主讲

    通过学习SICP,学生将能够理解如何设计、分析和实现复杂的程序系统,培养出强大的抽象思维能力。 课程内容涵盖了以下几个关键知识点: 1. **基本编程概念**:包括变量、数据结构(如列表、树)、控制结构(条件...

    SICP-Python版本

    SICP-Python版本

    Learn_sicp:学习sicp的一些代码

    《学习SICP:探索Racket编程的艺术》 SICP,全称为《Structure and Interpretation of Computer Programs》(计算机程序的结构与解释),是一本经典的计算机科学教材,由Harold Abelson和Gerald Jay Sussman合著,...

Global site tag (gtag.js) - Google Analytics