【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-07-31 12:48:29

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

PHP实现阳历到农历转换的类实例_php技巧

本文实例讲述了PHP实现阳历到农历转换的类.分享给大家供大家参考.具体如下: 复制代码 代码如下: <?php //PHP阳历到农历转换的一个类 class Calendar { //农历每月的天数     var $everyCMonth=array(     0=>array(8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1),     1=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,8,2),     2=>

细说Android事件传递

一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件,没有子布局的,如Button.TextView. ViewGroup继承自View,表示可以有子控件,如Linearlayout.Listview这些.而事件即MotionEvent,最重要的有3个: (1)MotionEvent.ACTION_DOWN  按下View,是所有事件的开始 (2)M

Oracle 实例恢复

--======================= -- Oracle 实例恢复 --=======================   一.Oracle实例失败     Oracle实例失败多为实例非一致性关闭所致,通常称为崩溃(crash).实例失败的结果等同于shutdown abort.     实例失败的原因         电源负载故障         硬件故障         后台进程失败         异常关闭数据库     实例失败后的状况         数据库可能丢失已提

oracle备份恢复参考日志——实例恢复

http://blog.csdn.net/robinson_0612/article/details/5768233 一.Oracle实例失败     Oracle实例失败多为实例非一致性关闭所致,通常称为崩溃(crash).实例失败的结果等同于shutdown abort.     实例失败的原因         电源负载故障         硬件故障         后台进程失败         异常关闭数据库     实例失败后的状况         数据库可能丢失已提交的事务以及存储了未

Android View事件传递详解

一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件,没有子布局的,如Button.TextView. ViewGroup继承自View,表示可以有子控件,如Linearlayout.Listview这些.而事件即MotionEvent,最重要的有3个: (1)MotionEvent.ACTION_DOWN  按下View,是所有事件的开始 (2)M

php下实现农历日历的代码_php实例

复制代码 代码如下: php农历日历 <?   ###########################################   #作者: 沈潋(S&S Lab)                      #   #E-mail:shenlian@hotmail.com              #   #web: http://www.focus-2000.com           #   #                                         #

test zfs dedup vs compress which suit in your environment

你的数据适合压缩还是适合开启去重? 这个可以拿到你的数据进行评估, 在一个已有使用zdb -S zpname进行评估, 然后使用zdb -DD产生一个报告. 例如 :  对zp1 pool的数据块, 采样评估 [root@db- ~]# zdb -S zp1 ^C 报告deduplicate table [root@db- ~]# zdb -DD zp1 DDT-sha256-zap-duplicate: 272229 entries, size 291 on disk, 141 in core

PHP中exec函数和shell_exec函数的区别_php实例

这两个函数都是执行Linux命令函数,不同的是获取返回结果不一样,exec只能获取最后一行数据,shell_execu则可以获取全部数据. 假如脚本路径下有如下文件: 复制代码 代码如下: -bash-4.1# ll 总用量 12 -rw-rw-r--. 1 www web 133  7月 16 15:00 a.php -rw-r--r--. 1 lee web  59  2月 29 17:05 b.php -rw-r--r--. 1 lee web  81  3月  8 17:00 c.php

php 世纪万年历

<? //世纪万年历 #这是唯一的设置-请输入php文件的位置 $file=$_SERVER['PHP_SELF']; //农历每月的天数 $everymonth=array( 0=>array(8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1), 1=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,8,2), 2=>array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,9,3),