【SICP练习】59 练习2.29



练习2.29

这种题,还有之前的那个rectangle的题目,对于变量、函数等的命名简直要让人疯掉。先来写出题目中的left-branch和right-branch吧。

(define (left-branch mobile)

(car mobile))

(define (right-branch mobile)

(cadr mobile))

注意这里是cadr而不是cdr。对应的branch-length和branch-structure。

(define (branch-length branch)

(car branch))

(define (branch-structure branch)

(cadr branch))

a小题并不难,b小题中的total-weight也就是要求每部分branch-structure。而根据题目的意思,如果一个分支吊着另一个活动体,那么这个活动体的重量就是这个分支的重量,否则分支的structure就是这个分支的重量。而判断这个分支是不是还有其他活动体我们可以用pair?来判断。而总重量就是左右两部分的重量之和。

(define (branch-weight branch)

(if (pair? (branch-structure branch))

(total-weight (branch-weight branch))

(branch-structure branch)))

(define (total-weight mobile)

(+ (branch-weight (left-branch mobile))

(branch-weight (right-branch mobile))))

我们来测试一下结果。

(define first-mobile (make-mobile(make-branch 20 10)

(make-branch20 40)))

(total-weight mobile)

;Value: 50

(define second-mobile (make-mobile(make-branch 40 first-mobile)

(make-branch 100 180)))

;Valeu: 230

下面开始做c小题了。先来看看什么是力矩—左杆的长度乘以吊在杆上的重量,等于这个活动体右边的同样乘积。这是活动体称为平衡的第一个条件,第二个条件则是要每个分支上吊着的子活动体也都平衡。于是我们可以定义如下的过程,我们先来定义力矩好了。

(define (branch-force branch)

(* (branch-length branch)

(branch-weight branch)))

(define (mobile-balance? mobile)

(let ((left (left-branch mobile))

(right (right-branch mobile)))

(and (= (branch-force left)

(branch-force right))

(branch-balance? left)

(branch-balance? right))))

(define (branch-balance? branch)

(if (pair? (branch-structure branch))

(mobile-balance? (branch-structure branch))

#t))

c小题我们也做完了,下面我们来乘胜追击完成最后一个小题好了。d小题将原先的list改成了cons。因此一开始所说的在right-branch和branch-structure要用cadr而不能用cdr,但是在这里用cdr就是正确的了。

(define (left-branch mobile)

(car mobile))

(define (right-branch mobile)

(cdr mobile))

(define (branch-length branch)

(car branch))

(define (branch-structure branch)

(cdr branch))

是不是感觉很神奇呢?那就来测试吧。

(define third-mobile (make-mobile(make-branch 20 25)

(make-branch30 40)))

;Value: third-mobile

third-mobile

;Value: ( ( 20 . 25) 30 . 40 )

注意第二章所讲的数据抽象,因此前面的mobile-balance?在这里也是一样可以用的。

时间: 2024-08-01 22:27:15

【SICP练习】59 练习2.29的相关文章

IDC服务标准103.219.29.1

1) 标准机房环境,提供365天全天候运营服务.2) 保证每月网络连通率在99.99%以上.3) 千兆光纤双路由直连CTTNET骨干节点,带宽品质优越.4) 专门技术人员7×24小时维护,有效保障网络的畅通和稳定性.5) 保证7×24小时电力供应,提供双路480kVA动力电源.备用柴油发电机等,保证持续供电率达99.99% .6) 业务开通:保证在合同签订后的3个工作日内,为用户开通IDC业务.7) 业务维护:如遇网络割接.扩容.调测等会对用户线路造成影响的情况,提前48小时通知客户.8) 故障

通用高防和网站高防188.219.29.1

〈1〉通用高防 针对.APP.金融.电商等类型业务,提供基于IP的超大流量防护能力,支持TCP/UDP等多种协议,可防护SYN Flood.ACK Flood等多种类型的,满足不同场景下的需求 〈2〉网站高防 针对网站类业务,通过强大的云端清洗集群以及1T超大防护带宽,帮助用户抵御超大流量DDoS,并且支持CC防护,防护能力全面,可确保您的网站安全 武汉网盾无视CC:扣97780861188.219.29.1188.219.29.2188.219.29.3188.219.29.4188.219.

spark-机器学习实践-K近邻应用实践一

K近邻应用-异常检测应用 原理: 根据数据样本进行KMeans机器学习模型的建立,获取簇心点,以簇为单位,离簇心最远的第五个点的距离为阈值,大于这个值的为异常点,即获得数据异常. 如图: 数据样本: 1,2.43,2.3899999 2,2.38,2.12 3,2.8,2.51 4,2.01,2.69 5,2.71,2.45 6,2.55,2.34 7,2.46,2.31 8,2.27,2.38 9,2.87,2.55 10,2.75,2.07 11,2.3899999,2.6100001 12

Pebbles(hdu2167)

Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1393    Accepted Submission(s): 797 Problem Description You're given an unlimited number of pebbles to distribute across an N x N game boa

004、单词吗?

15:43 2015-04-07 什么是英语单词?只是要连着写,中间没有空白符(空格.换行.Tab.等)的,都是英语单词,是吗?是的,英国佬估计就是这样想的.在29本著作,18个作者,四百六十万个单词中,统计出最常用的一千个单词中,居然包括这些: don'tI'llit'scan'tI'mwon'tthere'sI'vedidn'the'sfather'syou'llman's'emo'clockwouldn'tshe'smother'sma'amcouldn't I 服了 U !早就想整理这一

PHP实用小程序(七)

<? //用COOKIE保存投票人的投票记录 if($vote && !$already_voted) SetCookie("already_voted","1"); ?> <html> <head> <title>简易投票系统</title> </head> <body alink="#FF0000" link="#000099"

数字加网(二)— —调幅加网算法及实现

在上一篇中提到调幅加网的方法有有理正切.无理正切和超细胞方法.无理正切方法,与有理正切本质相同,但是因为正切值为无理数,不能保证网格的角点与输出设备记录栅格的角点重合,需要进行一个强制重合的过程,一般数字加网方法里对其讨论较少.而超细胞的方法相当于外面一个大的阈值矩阵是有理正切,里面若干小的阈值矩阵是无理正切的.下图分别是有理正切和超细胞方法. 上段提到阈值矩阵,如下图,其实也可以叫做蒙板或者窗口,即在待加网的图像上"走"一圈下来(扫描整幅图像),当前像素值比阈值矩阵中相对应的值大,则

14PKUkaoyan

准考证号 政治 政治分 外语 外语分 科目1 科目1分 科目2 科目2分 总分 专业代码 专业名称 专业名次 考试方式 报名号 100014014170001 思想政治理论 63 英语一 57 数学(一) 84 数字电路逻辑设计 133 337 085208 电子与通信工程 7 全国统考 110192162 100014014170002 思想政治理论 63 英语一 55 数学(一) 49 数字电路逻辑设计 102 269 085208 电子与通信工程 28 全国统考 110199995 100

第二次作业+105032014149

测试帖链接:http://www.cnblogs.com/wangkunhuang/p/6591939.html 问题答复: 闰年2月28和平年2月27日的问题,当时只考虑了最后一天的情况,之前都是直接复制黏贴前一部分的代码,在修改时忘了记范围: 把isLeapYear单独分开是为了不让if语句变得太长. 修改后代码: 1 package com.test; 2 import java.util.Scanner; 3 public class TestPractice { 4 /*闰年判断 5