naga:2-17 > 2-52

Todo

2.19

Exercise 2.17

(define (last-pair list)
  (if (null? (cdr list))
      list
      (last-pair (cdr list))))
;;gosh> (last-pair (list 23 72 149 34))
;;(34)

Exercise 2.18

(define (reverse_r l)
  (if (null? l)
      '()
      (append (reverse_r (cdr l)) (list (car l)))))
(define (reverse_i l)
  (define (reverse_iter l rl)
    (if (null? l)
        rl
        (reverse_iter (cdr l) (cons (car l) rl))))
  (reverse_iter l ()))
;;gosh> (define a (list 1 4 9 16 24))
;;a
;;gosh> (reverse_r a)
;;(24 16 9 4 1)
;;gosh> (reverse_i a)
;;(24 16 9 4 1)

Exercise 2.19

後日

Exercise 2.20

(define (same-parity-r x . y)
  (let ((even/odd? (if (even? x) even? odd?))
        (items (cons x y)))
    (define (rec l)
      (cond ((null? l) l)
            ((even/odd? (car l)) (cons (car l) (rec (cdr l))))
            (else (rec (cdr l)))))
    (rec items)))
(define (same-parity-i x . y)
  (let ((even/odd? (if (even? x) even? odd?)))
    (define (iter y l)
      (cond ((null? y) (cons x (reverse l)))
            ((even/odd? (car y)) (iter (cdr y) (cons (car y) l)))
            (else (iter (cdr y) l))))
    (iter y '())))
;;gosh> (same-parity-i 1 2 3 4 5 6 7)
;;(1 3 5 7)
;;gosh> (same-parity-i  2 3 4 5 6 7)
;;(2 4 6)
;;gosh> (same-parity-r 1 2 3 4 5 6 7)
;;(1 3 5 7)
;;gosh> (same-parity-r  2 3 4 5 6 7)
;;(2 4 6)

Exercise 2.21

(define (square-list-r l)
  (if (null? l)
      '()
      (cons (square (car l)) (square-list-r (cdr l)))))
(define (square-list-m l)
  (map square l))
;;gosh> (square-list-r (list 1 2 3 4))
;;(1 4 9 16)
;;gosh> (square-list-m (list 1 2 3 4))
;;(1 4 9 16)

Exercise 2.22

;; square-list-1ではanswerにはthingsの最初の項が最後に、thingsの次の項が最後から2番目にとlistされるため。
(define (square-list-1 items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (cons (square (car things))
                    answer))))
  (iter items '()))
;; square-list-2ではanswerのcar部にこれまでの結果が、cdr部にsquareのドットペアを生成している。
(define (square-list-2 items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (cons answer
                    (square (car things))))))
  (iter items '()))
;; 素直に
(define (square-list-3 items)
  (define (iter things answer)
    (if (null? things)
        (reverse answer)
        (iter (cdr things)
              (cons (square (car things))
                    answer))))
  (iter items '()))
;;gosh> (square-list-1 (list 1 2 3 4))
;;(16 9 4 1)
;;gosh> (square-list-2 (list 1 2 3 4))
;;((((() . 1) . 4) . 9) . 16)
;;gosh> (square-list-3 (list 1 2 3 4))
;;(1 4 9 16)

Exercise 2.23

(define (for-each proc items)
  (if (null? items)
      #t
      (begin (proc (car items)) (for-each proc (cdr items)))))
;;gosh> (for-each (lambda (x) (newline) (display x)) '(57 321 88))
;;
;;57
;;321
;;88#t

Exercise 2.24

;; (1 (2 (3 4)))
;; / : nilのつもり
;;  [1 :  ]->[  :/ ]
;;            |
;;           [2 :  ]->[  :/ ]
;;                     |
;;                    [3 :  ]->[4 :/ ]
;; treeは省略
;;gosh> (list 1 (list 2 (list 3 4)))
;;(1 (2 (3 4)))

Exercise 2.25

;;gosh> (car (cdr (car (cdr (cdr '(1 3 (5 7) 9))))))
;;7
;;gosh> (car (car '((7))))
;;7
;;gosh> (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr '(1 (2 (3 (4 (5 (6 7))))))))))))))))))
;;7

Exercise 2.26

;; (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))
;;gosh> (define x '(1 2 3))
;;x
;;gosh> (define y '(4 5 6))
;;y
;;gosh> (append x y)
;;(1 2 3 4 5 6)
;;gosh> (cons x y)
;;((1 2 3) 4 5 6)
;;gosh> (list x y)
;;((1 2 3) (4 5 6))

Exercise 2.27

(define (deep-reverse l)
  (if (null? l)
      '()
      (append (deep-reverse (cdr l))
              (list (if (pair? (car l))
                        (deep-reverse (car l))
                        (car l))))))
;;gosh> (define x '(( 1 (1 2)) ((3 4) 4)))
;;x
;;gosh> x
;;((1 (1 2)) ((3 4) 4))
;;gosh> (deep-reverse x)
;;((4 (4 3)) ((2 1) 1))
kacchi氏の解答のほうがきれい。

Exercise 2.28

(define (fringe tree)
  (cond ((null? tree) '())
        ((pair? tree) (append (fringe (car tree)) (fringe (cdr tree))))
        (else (list tree))))
;;gosh> x
;;((1 (1 2)) ((3 4) 4))
;;gosh> (fringe x)
;;(1 1 2 3 4 4)
;;gosh> (fringe (list x x))
;;(1 1 2 3 4 4 1 1 2 3 4 4)

Exercise 2.29

;; constructor
(define (make-mobile left right)
  (list left right))
(define (make-branch length structure)
  (list length structure))
;; a. seletor
(define (left-branch m)
  (car m))
(define (right-branch m)
  (cadr m))
(define (branch-length b)
  (car b))
(define (branch-structure b)
  (cadr b))
;; b. total-weight
(define (total-weight m)
  (let ((left-s (branch-structure (left-branch m)))
        (right-s (branch-structure (right-branch m))))
    (+ (if (number? left-s) left-s (total-weight left-s))
       (if (number? right-s) right-s (total-weight right-s)))))
;; c. balanced?
(define (balanced? m)
  (define (rec m)
    (let ((left (branch-structure (left-branch m)))
          (right (branch-structure (right-branch m))))
      (let ((left-w (if (number? left) left (rec left)))
            (right-w (if (number? right) right (rec right)))
            (left-l (branch-length (left-branch m)))
            (right-l (branch-length (right-branch m))))
        (if (and (number? left-w) (number? right-w)
                 (= (* left-w left-l) (* right-w right-l)))
            (+ left-w right-w)
            #f))))
  (number? (rec m)))
;; d.
;; constructor
(define (d)  ;-----以下のconstructorとselectorを使う時はコメントアウトする。 
(define (make-mobile left right)
  (cons left right))
(define (make-branch length structure)
  (cons length structure))
;; seletor
(define (left-branch m)
  (car m))
(define (right-branch m)
  (cdr m))
(define (branch-length b)
  (car b))
(define (branch-structure b)
  (cdr b))
)          ;------
;; test data    -- : 長さ 1  数字 : 錘
;;                 --+------
;;                 |       |
;;             ----+--     2
;;             |     |
;;             2     4
(define bl2w2 (make-branch 2 2))
(define bl1w4 (make-branch 1 4))
(define mbl2w2bl1w4 (make-mobile bl2w2 bl1w4))
(define bl3w2 (make-branch 3 2))
(define bl1mbl2w2bl1w4 (make-branch 1 mbl2w2bl1w4))
(define m-top (make-mobile bl1mbl2w2bl1w4 bl3w2))
(define bl2w3 (make-branch 2 3))
(define mbl2w3bl1w4 (make-mobile bl2w3 bl1w4))
(define bl1mbl2w3bl1w4 (make-branch 1 mbl2w3bl1w4))
(define m-top-x (make-mobile bl1mbl2w3bl1w4 bl3w2))
;;gosh> (total-weight m-top)
;;8
;;gosh> (total-weight m-top-x)
;;9
;;gosh> (balanced? m-top)
;;#t
;;gosh> (balanced? m-top-x)
;;#f

Exercise 2.30

(define (square-tree-d t)
  (cond ((null? t) '())
        ((number? t) (square t))
        (else (cons (square-tree-d (car t))
                    (square-tree-d (cdr t))))))
(define (square-tree-m t)
  (map (lambda (st)
         (if (pair? st)
             (square-tree-m st)
             (square st)))
       t))
;;gosh> tree
;;(1 (2 (3 4) 5) (6 7))
;;gosh> (square-tree-d tree)
;;(1 (4 (9 16) 25) (36 49))
;;gosh> (square-tree-m tree)
;;(1 (4 (9 16) 25) (36 49))

Exercise 2.31

(define (tree-map f t)
  (map (lambda (st)
               (if (pair? st)
                   (tree-map f st)
                   (f st)))
       t))
;;gosh> (define tree (list 1 (list 2 (list 3 4) 5) (list 6 7)))
;;tree
;;gosh> (define (square-tree tree) (tree-map square tree))
;;square-tree
;;gosh> (square-tree tree)
;;(1 (4 (9 16) 25) (36 49))

Exercise 2.32

(define (subsets s)
  (if (null? s)
      (list '())
      (let ((rest (subsets (cdr s))))
        (append rest (map (lambda (x) (cons (car s) x)) rest)))))
;;gosh> (display (subsets '(1 2 3)))
;;(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))#<undef>
;;letの変数の値を求める処理が引数のcdrをとる再帰となっているので、
;;       sの値             restの値                   mapの結果                    subsetsの値
;; 1.      '()                   -                            -                            (())
;; 2.      (3)                 (())                         (3)                        (() (3))
;; 3.    (2 3)             (() (3))                 ((2) (2 3))              (() (3) (2) (2 3))
;; 4.  (1 2 3)   (() (3) (2) (2 3))   ((1) (1 3) (1 2) (1 2 3))   (() (3) (2) (2 3) (1) (1 3)
;;                                                                                (1 2) (1 2 3)

Exercise 2.33

(define (map-n p sequence)
  (accumulate (lambda (x y) (cons (p x) y)) '() sequence))
(define (append-n seq1 seq2)
  (accumulate cons seq2 seq1))
(define (length-n sequence)
  (accumulate (lambda (x y) (+ 1 y)) 0 sequence))
;;gosh> (map-n cadr '((a b) (d e) (g h)))
;;(b e h)
;;gosh> (append-n '(a (b)) '((c)))
;;(a (b) (c))
;;gosh> (length-n '(a (b) (c d e)))
;;3

Exercise 2.34

(define (horner-eval x coefficient-sequence)
  (accumulate
   (lambda (this-coeff higher-term)
     (+ this-coeff (* x higher-term)))
   0
   coefficient-sequence))
;;gosh> (horner-eval 2 (list 1 3 0 5 0 1))
;;79

Exercise 2.35

(define (count-leaves-a t)
  (accumulate + 0
              (map (lambda (x)
                     (if (pair? x)
                         (count-leaves-a x)
                         1))
                   t)))
;;gosh> (define x (cons (list 1 2) (list 3 4)))
;;x
;;gosh> x
;;((1 2) 3 4)
;;gosh> (count-leaves-a x)
;;4
;;gosh> (count-leaves-a (list x x))
;;8

Exercise 2.36

(define (accumulate-n op init seqs)
  (if (null? (car seqs))
      '()
      (cons (accumulate op init (map car seqs))
            (accumulate-n op init (map cdr seqs)))))
;;gosh> (accumulate-n + 0 s)
;;(22 26 30)

Exercise 2.37

(define (dot-product v w)
  (accumulate + 0 (map * v w)))
(define (matrix-*-vector m v)
  (map (lambda (w) (dot-product v w)) m))
(define (transpose mat)
  (accumulate-n cons '() mat))
(define (matrix-*-matrix m n)
  (let ((cols (transpose n)))
    (map (lambda (v) (map (lambda (w) (dot-product v w)) cols)) m)))
;;gosh> m
;;((1 2 3 4) (4 5 6 6) (6 7 8 9))
;;gosh> v
;;(2 3 4 5)
;;gosh> (matrix-*-vector m v)
;;(40 77 110)
;;gosh> (transpose m)
;;((1 4 6) (2 5 7) (3 6 8) (4 6 9))
;;gosh> (matrix-*-matrix m (transpose m))
;;((30 56 80) (56 113 161) (80 161 230))

Exercise 2.38

(define (fold-right op init seq)
  (accumulate op init seq))
(define (fold-left op init seq)
  (define (iter result rest)
    (if (null? rest)
        result
        (iter (op result (car rest))
              (cdr rest))))
  (iter init seq))
;; 交換則が成り立つかな?

;;gosh> (fold-right / 1 (list 1 2 3))
;;3/2
;;gosh> (fold-left / 1 (list 1 2 3))
;;1/6
;;gosh> (fold-right list '() (list 1 2 3))
;;(1 (2 (3 ())))
;;gosh> (fold-left list '() (list 1 2 3))
;;(((() 1) 2) 3)
;;gosh> (fold-right + 0 (list 1 2 3))
;;6
;;gosh> (fold-left + 0 (list 1 2 3))
;;6

Exercise 2.39

(define (reverse-r seq)
  (fold-right (lambda (x y) (append y (list x))) '() seq))
(define (reverse-l seq)
  (fold-left (lambda (x y) (cons y x)) '() seq))
;;gosh> (define seq '(1 2 3 4))
;;seq
;;gosh> (reverse-r seq)
;;(4 3 2 1)
;;gosh> (reverse-l seq)
;;(4 3 2 1)

Exercise 2.40

(define (uniqe-pairs n)
  (flatmap (lambda (i)
             (map (lambda (j) (list i j))
                  (enumerate-interval 1 (- i 1))))
           (enumerate-interval 1 n)))
(define (prime-sum-pairs n)
  (map make-pair-sum
       (filter prime-sum?
               (uniqe-pairs n))))
(define (make-pair-sum pair)
  (list (car pair) (cadr pair) (+ (car pair) (cadr pair))))
(define (prime-sum? pair)
  (prime? (+ (car pair) (cadr pair))))
;;gosh> (uniqe-pairs 5)
;;((2 1) (3 1) (3 2) (4 1) (4 2) (4 3) (5 1) (5 2) (5 3) (5 4))
;;gosh> (prime-sum-pairs 6)
;;((2 1 3) (3 2 5) (4 1 5) (4 3 7) (5 2 7) (6 1 7) (6 5 11))

Exercise 2.41

(define (ordered-triples-sum n s)
  (filter (lambda (triples)
            (let ((i (car triples))
                  (j (cadr triples))
                  (k (caddr triples)))
              (if (= (+ i j k) s)
                  #t
                  #f)))
          (flatmap (lambda (k)
                     (flatmap (lambda (j)
                                (map (lambda (i) (list i j k))
                                     (enumerate-interval 1 j)))
                              (enumerate-interval 1 k)))
                   (enumerate-interval 1 n))))
;;gosh> (ordered-triples-sum 6 8)
;;((2 3 3) (2 2 4) (1 3 4) (1 2 5) (1 1 6))
;;だと思っていたら、distinctを理解していなかった。
(define (ordered-triples-sum n s)
  (filter (lambda (triples)
            (let ((i (car triples))
                  (j (cadr triples))
                  (k (caddr triples)))
              (if (and (< i j k) (= (+ i j k) s))
                  #t
                  #f)))
          (flatmap (lambda (k)
                     (flatmap (lambda (j)
                                (map (lambda (i) (list i j k))
                                     (enumerate-interval 1 j)))
                              (enumerate-interval 1 k)))
                   (enumerate-interval 1 n))))
;;gosh>  (ordered-triples-sum 6 8)
;;((1 3 4) (1 2 5))

Exercise 2.42

(define empty-board '())
(define (safe? k positions)
  (let ((qk (car positions)))
    (define (safe-colum? i rest-of-colums)
      (cond ((null? rest-of-colums) #t)
            (else (let ((qi (car rest-of-colums)))
                    (cond ((or (= qk qi) (= (+ qk i) qi) (= (- qk i) qi)) #f)
                          (else (safe-colum? (+ i 1) (cdr rest-of-colums))))))))
;;    (display positions) (display (safe-colum? 1 (cdr positions)))(newline)
    (safe-colum? 1 (cdr positions))))
(define (adjoin-position new-row k rest-of-queens)
  (cons new-row rest-of-queens))

(define (queens board-size)
  (define (queen-cols k)
    (if (= k 0)
        (list empty-board)
        (filter
         (lambda (positions) (safe? k positions))
         (flatmap
          (lambda (rest-of-queens)
            (map (lambda (new-row)
                   (adjoin-position new-row k rest-of-queens))
                 (enumerate-interval 1 board-size)))
          (queen-cols (- k 1))))))
  (queen-cols board-size))
;;gosh> (queens 4)
;;((3 1 4 2) (2 4 1 3))
;;gosh> (write (queens 5))
;;((4 2 5 3 1) (3 5 2 4 1) (5 3 1 4 2) (4 1 3 5 2) (5 2 4 1 3) (1 4 2 5 3) (2 5 3 1 4) (1 3 5 2 4) (3 1 4 2 5) (2 4 1 3 5))#<undef>
;;gosh> (length (queens 8))
;;92
kが使えてない!
対称形の考慮など奥深そうな問題だけど・・・

Exercise 2.43

;; queen-colsの呼ばれる回数は、board-sizeをnとすると
;;  queens-a : カラムに対して一度 -> 1+n
;;  queens-b : カラムの各ロウに対して再帰的にカラム数だけ ->
;;                                    1+n^1+n^2+n^3+...+n^n
;; 時間の推定は???  
(define (queens-a board-size)
  (let ((cc 0) (sc 0))
    (define (queen-cols k)
      (set! cc (+ cc 1))
      ;;(display "queens-cols:") (display k) (display "  ")
      (if (= k 0)
          (list empty-board)
          (filter
           (lambda (positions) (set! sc (+ sc 1)) (safe? k positions))
           (flatmap
            (lambda (rest-of-queens)
              (map (lambda (new-row)
                     (adjoin-position new-row k rest-of-queens))
                   (enumerate-interval 1 board-size)))
            (queen-cols (- k 1))))))
    (queen-cols board-size) (display cc) (display " ") (display sc) (display " ") (display (* 1.0 (/ sc cc)))))
(define (queens-b board-size)
  (let ((cc 0) (sc 0))
    (define (queen-cols k)
      (set! cc (+ cc 1))
      ;;  (display "queens-cols:") (display k) (display "  ")
      (if (= k 0)
          (list empty-board)
          (filter
           (lambda (positions) (set! sc (+ sc 1)) (safe? k positions))
           (flatmap
            (lambda (new-row)
              (map (lambda (rest-of-queens)
                     (adjoin-position new-row k rest-of-queens))
                   (queen-cols (- k 1))))
            (enumerate-interval 1 board-size)))))
    (queen-cols board-size) (display cc) (display " ") (display sc)(display " ") (display (* 1.0 (/ sc cc)))))
;;gosh> (queens-a 3)
;;4 18#<undef>
;;gosh> (queens-b 3)
;;40 60#<undef>
;;gosh> (queens-a 4)
;;5 60#<undef>
;;gosh> (queens-b 4)
;;341 624#<undef>
;;gosh> (queens-a 5)
;;6 220#<undef>
;;gosh> (queens-b 5)
;;3906 8160#<undef>
;;gosh> (queens-a 6)
;;7 894#<undef>
;;gosh> (queens-b 6)
;;55987 128904#<undef> 

Exercise 2.44

(define (up-split painter n)
  (if (= n 0)
      painter
      (let ((smaller (up-split painter (- n 1))))
        (below painter (beside smaller smaller)))))

Exercise 2.45

(define (split op1 op2)
  (lambda (painter n)
    (if (= n 0)
        painter
        (let ((smaller ((split op1 op2) painter (- n 1))))
          (op1 painter (op2 smaller smaller))))))
(define right-split (split beside below))
(define up-split (split below beside))
;;(plot (corner-split wave 4))

Exercise 2.46

;; constructor
(define (make-vect x y)
  (cons x y))
;; selectors
(define (xcor-vect v)
  (car v))
(define (ycor-vect v)
  (cdr v))
;; operations
(define (add-vect v1 v2)
  (make-vect (+ (xcor-vect v1) (xcor-vect v2))
             (+ (ycor-vect v1) (ycor-vect v2))))
(define (sub-vect v1 v2)
  (add-vect v1 (scale-vect -1 v2)))
(define (scale-vect s v)
  (make-vect (* s (xcor-vect v)) (* s (ycor-vect v))))
;;gosh> (define v21 (make-vect 2 1))
;;v21
;;gosh> v21
;;(2 . 1)
;;gosh> (xcor-vect v21)
;;2
;;gosh> (ycor-vect v21)
;;1
;;gosh> (define v-24 (make-vect -2 4))
;;v-24
;;gosh> (add-vect v21 v-24)
;;(0 . 5)
;;gosh> (sub-vect v21 v-24)
;;(4 . -3)
;;gosh> (scale-vect 2 v21)
;;(4 . 2)

Exercise 2.47

;; constructor
(define (make-frame origin edge1 edge2)
  (list origin edge1 edge2))
;; selectors
(define (origin-frame f)
  (car f))
(define (edge1-frame f)
  (cadr f))
(define (edge2-frame f)
  (caddr f))
;; constructor-2
(define (make-frame-p origin edge1 edge2)
  (cons origin (cons edge1 edge2)))
;; selectors
(define (origin-frame-p f)
  (car f))
(define (edge1-frame-p f)
  (cadr f))
(define (edge2-frame-p f)
  (cddr f))
;;gosh> (define origin (make-vect 1 1))
;;origin
;;gosh> (define edge1 (make-vect 2 2))
;;edge1
;;gosh> (define edge2 (make-vect 3 3))
;;edge2
;;gosh> (define frame (make-frame origin edge1 edge2))
;;frame
;;gosh> (origin-frame frame)
;;(1 . 1)
;;gosh> (edge1-frame frame)
;;(2 . 2)
;;gosh> (edge2-frame frame)
;;(3 . 3)
;;gosh> (define frame-p (make-frame-p origin edge1 edge2))
;;frame-p
;;gosh> (origin-frame-p frame-p)
;;(1 . 1)
;;gosh> (edge1-frame-p frame-p)
;;(2 . 2)
;;gosh> (edge2-frame-p frame-p)
;;(3 . 3)

Exercise 2.48

;; constructor
(define (make-segment sv ev)
  (cons sv ev))
;; selectors
(define (start-segment s)
  (car s))
(define (end-segment s)
  (cdr s))

Exercise 2.49

;; a
(define frame-painter (segments->painter
                       (list (make-segment (make-vect 0 0)
                                           (make-vect 1 0))
                             (make-segment (make-vect 1 0)
                                           (make-vect 1 1))
                             (make-segment (make-vect 1 1)
                                           (make-vect 0 1))
                             (make-segment (make-vect 0 1)
                                           (make-vect 0 0)))))
;; b
(define X-painter (segments->painter
                   (list (make-segment (make-vect 0.0 0.0)
                                       (make-vect 1.0 1.0))
                         (make-segment (make-vect 1.0 0.0)
                                       (make-vect 0.0 1.0)))))
;; c
(define diamond-painter (segments->painter
                          (list (make-segment (make-vect 0.0 0.5)
                                              (make-vect 0.5 0.0))
                                (make-segment (make-vect 0.5 0.0)
                                              (make-vect 1.0 0.5))
                                (make-segment (make-vect 1.0 0.5)
                                              (make-vect 0.5 1.0))
                                (make-segment (make-vect 0.5 1.0)
                                              (make-vect 0.0 0.5)))))
;; d   naoya_t氏に感謝
(define wave (segments->painter
              (append
               (make-path (make-vect 0.0  0.86)
                          (make-vect 0.16 0.60)
                          (make-vect 0.28 0.65)
                          (make-vect 0.42 0.65)
                          (make-vect 0.35 0.86)
                          (make-vect 0.42 1.0))
               (make-path (make-vect 0.58 1.0)
                          (make-vect 0.65 0.86)
                          (make-vect 0.58 0.65)
                          (make-vect 0.76 0.65)
                          (make-vect 1.0  0.35))
               (make-path (make-vect 1.0  0.14)
                          (make-vect 0.60 0.46)
                          (make-vect 0.76 0.0))
               (make-path (make-vect 0.58 0.0)
                          (make-vect 0.50 0.17)
                          (make-vect 0.42 0.0))
               (make-path (make-vect 0.24 0.0)
                          (make-vect 0.35 0.51)
                          (make-vect 0.30 0.59)
                          (make-vect 0.16 0.41)
                          (make-vect 0.0  0.65))
               )))              
;;(plot wave)

Exercise 2.50

(define (flip-horiz painter)
  (transform-painter painter
                    (make-vect 1.0 0.0)
                    (make-vect 0.0 0.0)
                    (make-vect 1.0 1.0)))
(define (rotate180 painter)
  (flip-horiz (flip-vert painter)))
(define (rotate270 painter)
  (rotate90 (rotate180 painter)))
;;(plot (rotate180 wave))
;;(plot (rotate270 wave))

Exercise 2.51

(define (below p1 p2)
  (let ((split-point (make-vect 0.0 0.5)))
    (let ((paint-lower
           (transform-painter p1
                              (make-vect 0.0 0.0)
                              (make-vect 1.0 0.0)
                              split-point))
          (paint-upper
           (transform-painter p2
                              split-point
                              (make-vect 1.0 0.5)
                              (make-vect 0.0 1.0))))
      (lambda (frame)
        (paint-lower frame)
        (paint-upper frame)))))
(define (below1 p1 p2)
  (rotate90 (beside (rotate270 p1) (rotate270 p2))))
;;(plot (below wave wave))

Exercise 2.51

;; a
(define wave2 (segments->painter
              (append
               (make-path (make-vect 0.0  0.86)
                          (make-vect 0.16 0.60)
                          (make-vect 0.28 0.65)
                          (make-vect 0.42 0.65)
                          (make-vect 0.35 0.86)
                          (make-vect 0.42 1.0))
               (make-path (make-vect 0.58 1.0)
                          (make-vect 0.65 0.86)
                          (make-vect 0.58 0.65)
                          (make-vect 0.76 0.65)
                          (make-vect 1.0  0.35))
               (make-path (make-vect 1.0  0.14)
                          (make-vect 0.60 0.46)
                          (make-vect 0.76 0.0))
               (make-path (make-vect 0.58 0.0)
                          (make-vect 0.50 0.17)
                          (make-vect 0.42 0.0))
               (make-path (make-vect 0.24 0.0)
                          (make-vect 0.35 0.51)
                          (make-vect 0.30 0.59)
                          (make-vect 0.16 0.41)
                          (make-vect 0.0  0.65))
               (make-path (make-vect 0.45 0.73)
                          (make-vect 0.50 0.75)
                          (make-vect 0.55 0.73))
               )))
;;(plot wave2)
;; b
(define (corner-split  painter n)
  (if (= n 0)
      painter
      (let ((up (up-split painter (- n 1)))
            (right (right-split painter (- n 1)))
            (corner (corner-split painter (- n 1))))
        (beside (below painter up)
                (below right corner)))))
;;(plot (corner-split wave2 4))
;; c
(define (square-limit painter n)
  (let ((combine4 (square-of-four flip-horiz identity
                                  rotate180 flip-vert)))
    (combine4 (corner-split (flip-horiz painter) n))))
;;(plot (square-limit wave2 0))

タグ:

+ タグ編集
  • タグ:
最終更新:2008年02月27日 22:10
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。