2.26
2.27
2.28
2.29
2.29 cons
2.30
(define x (list 1 2 3))
(define y (list 4 5 6))
(append x y)
(cons x y)
(list x y)
(define z (list x y))
(car z)
(cdr z)
2.27
(define nil '())
(define (my-reverse x)
(if (null? x)
nil
(append (my-reverse (cdr x)) (list (car x)))))
(define (deep-reverse lst)
(define (iter lst result)
(cond ((null? lst) result)
((not (pair? (car lst))) (iter (cdr lst) (cons (car lst) result)))
(else (iter (cdr lst) (cons (deep-reverse (car lst)) result)))))
(iter lst nil))
(define x (list (list 1 2) (list 3 4 5) (list 6 7) 8))
(define y (list 1 2))
(my-reverse x)
(deep-reverse x)
2.28
(define nil '())
(define x (list (list 1 2) (list 3 4)))
(define y (list x x))
(define (fringe x)
(define iter (lambda (x)
(append (fringe (car x)) (fringe (cdr x)))))
(cond ((null? x) nil)
((not (pair? x)) (list x))
(else (iter x))))
(fringe x)
(newline)
(fringe y)
2.29
(define (make-mobile left right)
(list left right))
(define (make-branch length structure)
(list length structure))
(define (left-branch m)
(car m))
(define (right-branch m)
(car (cdr m)))
(define (branch-length b)
(car b))
(define (branch-structure b)
(car (cdr b)))
(define l-branch (make-branch (make-branch 2 2) (make-branch 2 2)))
(define r-branch (make-branch (make-branch 2 2) (make-branch 2 2)))
(define mobile (make-mobile l-branch r-branch))
(left-branch mobile)
(right-branch mobile)
(define (is-mobile? m)
(and (pair? m)
(pair? (left-branch m))
(pair? (right-branch m))))
(define (total-weight m)
(if (is-mobile? m)
(+ (total-weight (left-branch m)) (total-weight (right-branch m)))
(branch-structure m)))
(define (total-moment m)
(if (is-mobile? m)
(+ (total-moment (left-branch m)) (total-moment (right-branch m)))
(* (branch-length m) (branch-structure m))))
(total-weight mobile)
(total-moment mobile)
(define (is-mobile-deep-than-2-level? m)
(and (pair? m)
(pair? (left-branch m))
(pair? (right-branch m))
(pair? (left-branch (left-branch m)))
(pair? (right-branch (left-branch m)))
(pair? (left-branch (right-branch m)))
(pair? (right-branch (right-branch m)))))
(is-mobile-deep-than-2-level? mobile)
(define (is-banlanced? m)
(if (is-mobile-deep-than-2-level? m)
(and (is-banlanced? (left-branch m)) (is-banlanced? (right-branch m)))
(= (total-moment (left-branch m)) (total-moment (right-branch m)))))
2.29 cons
(define (make-mobile left right)
(cons left right))
(define (make-branch length structure)
(cons length structure))
(define (left-branch m)
(car m))
(define (right-branch m)
(cdr m))
(define (branch-length b)
(car b))
(define (branch-structure b)
(cdr b))
(define l-branch (make-branch (make-branch 2 2) (make-branch 2 2)))
(define r-branch (make-branch (make-branch 2 2) (make-branch 2 2)))
(define mobile (make-mobile l-branch r-branch))
(left-branch mobile)
(right-branch mobile)
(define (is-mobile? m)
(and (pair? m)
(pair? (left-branch m))
(pair? (right-branch m))))
(define (total-weight m)
(if (is-mobile? m)
(+ (total-weight (left-branch m)) (total-weight (right-branch m)))
(branch-structure m)))
(define (total-moment m)
(if (is-mobile? m)
(+ (total-moment (left-branch m)) (total-moment (right-branch m)))
(* (branch-length m) (branch-structure m))))
(total-weight mobile)
(total-moment mobile)
(define (is-mobile-deep-than-2-level? m)
(and (pair? m)
(pair? (left-branch m))
(pair? (right-branch m))
(pair? (left-branch (left-branch m)))
(pair? (right-branch (left-branch m)))
(pair? (left-branch (right-branch m)))
(pair? (right-branch (right-branch m)))))
(is-mobile-deep-than-2-level? mobile)
(define (is-banlanced? m)
(if (is-mobile-deep-than-2-level? m)
(and (is-banlanced? (left-branch m)) (is-banlanced? (right-branch m)))
(= (total-moment (left-branch m)) (total-moment (right-branch m)))))
2.30
(define nil '())
(define (square x)
(* x x))
(define (square-tree tree)
(cond ((null? tree) nil)
((not (pair? tree)) (square tree))
(else (cons (square-tree (car tree)) (square-tree (cdr tree))))))
(define (square-tree-map tree)
(map (lambda (sub-tree)
(if (pair? sub-tree)
(square-tree-map sub-tree)
(square sub-tree)))
tree))
(square-tree (list 1 (list 2 (list 3 4) 5) (list 6 7)))
(square-tree-map (list 1 (list 2 (list 3 4) 5) (list 6 7)))