scheme 层次性结构

前文提到scheme的表是一种序对的层次性结构,本节对层次性结构进行一点扩展,通过树状结构来表达该结构。
练习2.24 求值(list 1 (list 2 (list 3 4))),给出对应的层次性结构。
求值部分就扔进去就完了(1 (2 (3 4)))
结构大概是(1 (2 (3 4))) → (1)&(2 (3 4))→ (2) (3 4)→(3) (4)
练习2.25 给出能从下面各表取出7的car和cdr组合
单纯的car和cdr的运用:
(car (cdr (car (cdr (cdr (list 1 3 (list 5 7) 9))))))
(car (car (list (list 7))))
(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7))))))))))))))))))
练习2.26 几个序对组合式的简单表达
假定已将x和y定义为如下两个表:
(define x (list 1 2 3))
(define y (list 4 5 6))
解释器对如下的表达式打印出什么结果:

(append x y)
(1 2 3 4 5 6)
(cons x y)
((1 2 3) 4 5 6)
(list x y)
((1 2 3) (4 5 6))
练习2.27 修改练习2.18中做的reverse过程,得到一个deep-reverse过程,反转表的过程中需将其中的子树也发转过来
其实就是在reverse过程中判断一下car x是否为序对,如果是就再重复一遍reverse过程。

点击查看代码
;reverse过程
(define (reverse x)
    (if (null? x)
        nil
        (append (reverse (cdr x)) (list (car x)))
    )
)
;在reverse过程基础上增加判断
(define (reverse-deep x)
    (if (null? x)
        nil
        (append (reverse-deep (cdr x))
            (if (pair? (car x))
                (list (reverse-deep (car x)))
                (list (car x))
            )
        )
    )
)
练习2.28 写一个过程fringe,它以一棵树为参数,其元素是这棵树的所有树叶,按照从左到右顺序: 和2.27的思路类似,插入对car x的判断,如果是序对就重复一遍fringe的过程。
点击查看代码
(define (fringe x)
    (if (null? x)
        nil
        (append 
;判断取出的元素是否为序对,如果是则再遍历排列一遍
            (if (pair? (car x))
                (fringe (car x))
                (list (car x)))                
                (fringe (cdr x)))))
练习2.29 一个二叉活动体由两个分支组成,一个是左分支,另一个是右分支。每个分支是一个具有确定长度的杆,上面或者吊着一个重量,或者吊着另一个二叉活动体。我们可以用复合数据对象表示这种二叉活动体,将它通过其两个分支构造起来: (define (make-mobile left right) (list left right)) 分支可以从一个length(它应该是一个数)再加上一个structure构造出来,这个structure或者是一个数或者是另一个活动体: a)请写出相应的选择函数left-branch、right-branch、branch-length和branch-structure: 对于mobile函数来说左右其实就是前后两个序对,因此左右选择函数就是:
点击查看代码
(define (left-branch mobile)
    (car mobile))
(define (right-branch mobile)
    (cdr mobile))
同样的,length和structure选择函数:
点击查看代码
(define (branch-length branch)
    (car branch))
(define (branch-structure branch)
    (cdr branch))
b)用你的选择函数定义过程total-weight,它返回一个活动体的总重量: 重量就是structure定义的量,那么就是遍历整棵树,返回每枝structure的量:
点击查看代码
(define (total-weight mobile)
    (if (not (pair? mobile)) 
        mobile
        (+
            (branch-weight (left-branch mobile))
            (branch-weight (right-branch mobile)))
    )
)
(define (branch-weight branch)
    (if (pair? branch)
        (if (pair? (branch-structure branch))
        (total-weight (branch-structure branch))
        (branch-structure branch))
        branch
    )
)
c)一个活动称为是平衡的,需要左分支的力矩等于其右分支的力矩,设计一个过程,它能检查一个二叉活动体是否平衡 力矩即分叉长度*分叉承受的重量,因此挨个叉分析:
点击查看代码
;求某一分支的力矩
(define (branch-torque branch)
    (* (branch-length branch)
       (branch-weight branch)))
;判断分支是否平衡
(define (branch-balanced? branch)
    (if (pair? (branch-structure branch))
        (balanced? (branch-structure branch))
        #t
    )
)
;判断二叉体是否平衡
(define (balanced? mobile)
    (and ( = (branch-torque (left-branch mobile))
             (branch-torque (right-branch mobile)))
         (branch-balanced? (left-branch mobile))
         (branch-balanced? (right-branch mobile))         
    )
)
posted @ 2025-12-15 19:39  檐上落白luckin  阅读(4)  评论(0)    收藏  举报