【SICP练习】44 练习2.3



练习2.3

我们并不必急于写出点什么,先来回过头看看书吧。第56页说到了一种称为按愿望思维的强有力的综合策略。在这道题里,我们就可以假设已经写好了能够表示矩形的代码,以及能够求矩形长和宽的函数。

于是像先定义出add-rat一样,我们先定义出求矩形的周长和面机的函数。

(define(get-perimeter x)

(let ((length (rectangle-length x))

(width (rectangle-width x)))

(* 2 (+ length width))))

(define(get-area x)

(* (rectangle-length x) (rectangle-widthx)))

啊哈,书上要求用2中方式来表示矩形。我先来说说比较难看的一种表示方式,我一开始想到的下面那一种。

(define(make-ractangle rec-length-1 rec-length-2 rec-width-1 rec-width-2)

(cons (cons rec-length-1 rec-length-2)

(cons rec-width-1 rec-width-2)))

(define(rec-len-1 x)

(car (car x))

(define(rec-len-2 x)

(cdr (car x))

(define(rec-wid-1 x)

(car (cdr x))

(define(rec-wid-2 x)

(cdr (cdr x))

如书上所说,我们还要加载一下练习2.2中的代码。然后我们就可以开始构造矩形了。

(definelen-1 (make-segment (make-point 0 0)

(make-point 5 0)))

(definelen-2 (make-segment (make-point 0 4)

(make-point 5 4)))

(definewid-1 (make-segment (make-point 0 0)

(make-point 0 4)))

(definewid-2 (make-segment (make-point 5 0)

(make-point 5 4)))

(definerectangle-first (make-rectangle len-1 len-2 wid-1 wid-2))

这样打印出来的肯定是很混乱的,估计是一大堆括号的嵌套。所以还是要想书中那样自己写一个打印的函数。这里也要加载前面的print-point函数。

(define(print-rec x)

(let ((l1 (len-1 x))

(l2 (len-2 x))

(w1 (wid-1 x))

(w2 (wid-2 x)))

(newline)

(display “Length-1: “)

(print-point (start-segment l1))

(print-point (end-segment l1))

(newline)

(display “Length-2: “)

(print-point (start-segment l2))

(print-point (end-segment l2))

(newline)

(display “Width-1: “)

(print-point (start-segment w1))

(print-point (end-segment w1))

(newline)

(display “Width-1: “)

(print-point (start-segment w2))

(print-point (end-segment w2))

现在打印出来的就比较直观了。

(print-rec rectangle-first)

Length-1:

(0,0)

(5,0)

Length-2:

(0,4)

(5,4)

Width-1:

(0,0)

(0,4)

Width-2

(5,0)

(5,4)

下面我们还需要函数来计算长和宽。

(define (get-length x)

(let((length (len-1 x)))

(let ((start (start-segment length))

(end (end-segment length)))

(- (x-point end) (x-point start)))))

(define (get-width x)

(let((width (wid-1 x)))

(let ((start (start-segment width))

(end (end-segment width)))

(- (y-point end) (y-point start)))))

下面就可以来计算长和宽了,试试吧。

(get-perimeter rectangle-first)

;Value: 18

(get-area rectangle-fist)

;Value: 20

这种方式真是麻烦,谁会一开始想到这种呢,还是用两条线段简单啊,反正是矩形又不是菱形。

(define (make-ractangle length width)

(cons length width))

(define (rec-len x)

(car x))

(define (rec-wid x)

(cdr x))

(define (get-length x)

(let((length (rec-len x)))

(let ((start (start-segment length))

(end (end-segment length)))

(- (x-point end) (x-point start)))))

(define (get-width x)

(let((width (rec-wid x)))

(let ((start (start-segment width))

(end (end-segment width)))

(- (y-point end) (y-point start)))))

现在来创建矩形也很简单了。

(define len (make-segment (make-point 00)

(make-point 5 0)))

(define wid (make-segment (make-point 00)

(make-point 4 0)))

(define rectangle-second(make-rectangle len wid))

时间: 2024-10-01 03:39:03

【SICP练习】44 练习2.3的相关文章

中联部原非洲局长被双开:行为底线全失守亦官亦商

稻花香呵呵一笑大家好以后还请多关照而那道白光更是冲刺向前利剑一挥一道璀璨的蓝光剑气横扫了出去无数白光飞起 而且还有N多附加属性至于那个炎舞的特技估计也差不到哪里去总之一套亚特兰蒂斯穿上之后凌雪在白云城基本上是难逢敌手了 而我这边首先要解决的便是骁骑将和地狱火这时候我终于感觉到有些棘手了这些人没有一个是省油的灯现在凑在了一起想要一举击杀谈何容易 She crossed herself once more, then flitted through the opening in the iron g

商学院

前 言 中南大学以“建设特色鲜明的世界一流大学”为办学目标,主动对接国家重大发展战略需求,为行业和地方社会经济发展服务,坚持将“质量提升”作为构建一流本科教育的核心任务.为进一步深化本科教育教学改革,完善本科人才培养体系,全面提升人才培养质量,学校从2014年3月开始,启动2016版本科人才培养方案的修订工作,同时组织了各教学单位对其开设课程的教学大纲进行修订.教学大纲是实施专业培养方案,实现高校培养目标及要求的教学指导文件,是组织教学过程.进行教学质量评估和实施教学管理的主要依据.制订与本科教

SICP 习题 (1.44)解题总结

SICP 习题1.44 要求我们实现一个平滑函数的过程,和以往一样,如果你太在意平滑函数的数学定义你就输了.简单的办法就是直奔平滑函数的要求,其实就是给我们一个不清楚细节的函数f,要求我们返回一个过程专门计算(f (+ x dx)) , (f x) , (f (- x dx))的平均值.其中dx是事先定义好的一个很小的数,比如0.001. 这就比较简单了,直接实现如下: (define (smooth f) (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x

【SICP练习】39 练习1.44

 练习1.44 相信如果大家认真做了前面的几道习题,这一题就比较简单了.smooth过程几乎可以直接写出: (define smooth (lambda (f) (lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3)))) 当然,在这之前应该先将dx关联一个数值,比如0.000001等等.至于利用smooth和练习1.43中的repeated来对给定的函数进行n次平滑处理,也是极为简单的. ((repeated (smooth square

SICP 1.40 1.41 1.42 1.43 1.44

解:1.40 (define (cubic a b c)   (lambda (x) (+ (* x x x) (* a x x) (* b x) c))) 1.41 (define (double f)   (lambda (x) (f (f x)))) (double double) => (double (double f)),则 (double (double double)) => (double (double (double (double f)))) 把inc代入f,得(((d

【转】每天一个linux命令(44):top命令

原文网址:http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列

Effective C++ 43,44

43.明智地使用多继承. 多继承带来了极大的复杂性.最基本的一条就是二义性. 当派生类为多继承时,其多个基类有同名的成员时,就会出现二义性.通常要明确其使用哪个成员的.显式地限制修饰成员不仅很笨拙,而且会带来限制.当显式地用一个类名来修饰一个虚函数时,函数就会被固定,而不再具有虚拟的特性.对于虚函数,若两个基类拥有一个同名同参的虚函数,当派生类没有重新定义虚函数时(可以只声明),直接调用这个同名函数会出二义性错误,需要指明其类.而当派生类中重新定义了这个函数,这是不可能的,因为一个类只允许有唯一

SICP 习题 (1.46)解题总结

SICP 习题 1.46 要求我们写一个过程iterative-improve,它以两个过程为参数,其中一个参数用来检测猜测是否足够好,另一个参数用来改进猜测.过程iterative-improve应该返回另一个过程,所返回的过程接收一个参数作为初始猜测,然后不断改进猜测直到结果足够好.题目还要求我们使用iterative-improve重写1.1.7的sqrt过程和1.3.3节的fixed-point过程. 因为涉及到高阶函数,所以整个题目理解起来有一点点费劲.不过这道题作为第一章的收官题确实

SICP 1.19

解:这道题很有意思,结论是斐波那契数也可以用对数时间复杂度获得. 通过Tpq(Tpq)=TPQ建立方程,解得: P=pp+qq Q=qq+2pq 程序如下: (define (fib n)   (define (even? n)     (= (remainder n 2) 0))   (define (fib-iter a b p q count)     (cond ((= count 0) b)           ((even? count) (fib-iter a