SICP問題2.29
二進モービル
ここまで出てる定義
(define (make-mobile left right) (list left right)) (define (make-branch length structure) (list length structure))
a.(モービルの枝を返す) left-branch と right-branch, (枝の部品を返す) branch-length と branch-structure
(define (left-branch mobile) (car mobile)) (define (right-branch mobile) (car (cdr mobile))) (define (branch-length branch) (car branch)) (define (branch-structure branch) (car (cdr branch)))
b.モービルの全重量を返す手続き total-weight
(define (total-weight mobile) (define (iter-branch branch result) (if (pair? (branch-structure branch)) (+ (iter-branch (left-branch (branch-structure branch)) result) (iter-branch (right-branch (branch-structure branch)) result)) (+ (branch-structure branch) result))) (+ (iter-branch (left-branch mobile) 0) (iter-branch (right-branch mobile) 0)))
c.モービルが釣合っているかどうかをテストする述語 balanced
(define (balanced? mobile) (define (br-torque br) (if (pair? (branch-structure br)) (* (branch-length br) (total-weight (branch-structure br))) (* (branch-length br) (branch-structure br)))) (define (mb-balanced? mb) (= (br-torque (left-branch mb)) (br-torque (right-branch mb)))) (define (iter-balanced? mb) (cond ((and (pair? (branch-structure (left-branch mb))) (pair? (branch-structure (right-branch mb)))) (and (mb-balanced? (branch-structure (left-branch mb))) (mb-balanced? (branch-structure (right-branch mb))) (mb-balanced? mb))) ((and (pair? (branch-structure (left-branch mb))) (not (pair? (branch-structure (right-branch mb))))) (and (mb-balanced? (branch-structure (left-branch mb))) (mb-balanced? mb))) ((and (not (pair? (branch-structure (left-branch mb)))) (pair? (branch-structure (right-branch mb)))) (and (mb-balanced? (branch-structure (right-branch mb))) (mb-balanced? mb))) (else (and (mb-balanced? mb))))) (mb-balanced? mobile))
d.構成子を
(define (make-mobile left right) (cons left right)) (define (make-branch length structure) (cons length structure))
に変更した場合、プログラムの変更が必要な部分。
(define (right-branch mobile) (cdr mobile)) (define (branch-structure branch) (cdr branch))