现在的位置: 首页 > 综合 > 正文

sicp 习题2.29

2013年08月13日 ⁄ 综合 ⁄ 共 1228字 ⁄ 字号 评论关闭
(define (make-mobile left right)
  (list left right))(define mobile (make-mobile left right))
(define (make-branch length structure)
  (list length structure))
(define branch (make-branch length structure))
(define (left-branch mobile)
    (car mobile))

(define (right-branch mobile)
    (cadr mobile))
(define (branch-length branch)
    (car branch))

(define (branch-structure branch)
    (cadr branch))

(define (total-weight mobile)
  (+ (branch-weight (left-branch mobile))
     (branch-weight (right-branch mobile))))
(define (branch-weight branch)
  (if (pair? (branch-structure branch))
      (total-weight (branch-structure branch))
      (branch-structure branch)))
(define (branch-torque branch)
    (* (branch-length branch)
       (branch-weight branch)))

(define (mobile-balance? mobile)
    (let ((left (left-branch mobile))
          (right (right-branch mobile)))
        (and                                        ; 必须同时满足以下三个条件,才是平衡的活动体
            (same-torque? left right)
            (branch-balance? left)
            (branch-balance? right))))

(define (same-torque? left right)
    (= (branch-torque left)
       (branch-torque right)))

(define (branch-balance? branch)
    (if (hangs-another-mobile? branch)              ; 如果分支上有子活动体
        (mobile-balance? (branch-structure branch))  ; 那么(递归地)检查子活动体的平衡性
        #t))                                        ; 否则,返回 #t  true
如果将 (define (make-mobile left right)

(cons left right))


那么 (define (left-mobile mobile)
                  (car mobile))
(define (right-mobile mobile)
                 (cdr mobile))

list 和 cons 的区别, 一个简单的例子: (list a b c) = (cons a (cons b (cons c '())))


抱歉!评论已关闭.