免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: win_hate
打印 上一主题 下一主题

SICP 习题参考答案 2.2  关闭 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2008-10-18 10:31 |只看该作者

Exercise 2.46. 答案


  1. (define (make-vect x y)
  2.   (list x y))

  3. (define (xcor-vect v)
  4.   (car v))

  5. (define (ycor-vect v)
  6.   (cadr v))

  7. (define (add-vect w v)
  8.   (map + w v))

  9. (define (sub-vect w v)
  10.   (map - w v))

  11. (define (scale-vect k v)
  12.   (map (lambda (x) (* k x)) v))
复制代码

论坛徽章:
0
62 [报告]
发表于 2008-10-18 10:40 |只看该作者

Exercise 2.47.

Exercise 2.47.  Here are two possible constructors for frames:

(define (make-frame origin edge1 edge2)
  (list origin edge1 edge2))

(define (make-frame origin edge1 edge2)
  (cons origin (cons edge1 edge2)))

For each constructor supply the appropriate selectors to produce an implementation for frames.

[ 本帖最后由 win_hate 于 2008-10-18 11:59 编辑 ]

论坛徽章:
0
63 [报告]
发表于 2008-10-18 10:43 |只看该作者

Exercise 2.47. 答案


  1. (define (make-frame origin edge1 edge2)
  2.   (list origin edge1 edge2))

  3. (define (origin-frame frame)
  4.   (car frame))

  5. (define (edge1-frame frame)
  6.   (cadr frame))

  7. (define (edge2-frame frame)
  8.   (caddr frame))
复制代码


这里只实现了用 list 的,用 cons 的就算了吧。

[ 本帖最后由 win_hate 于 2008-10-18 11:59 编辑 ]

论坛徽章:
0
64 [报告]
发表于 2008-10-18 10:45 |只看该作者

Exercise 2.48.

Exercise 2.48.  A directed line segment in the plane can be represented as a pair of vectors -- the vector running from the origin to the start-point of the segment, and the vector running from the origin to the end-point of the segment. Use your vector representation from exercise 2.46 to define a representation for segments with a constructor make-segment and selectors start-segment and end-segment.

论坛徽章:
0
65 [报告]
发表于 2008-10-18 10:47 |只看该作者

Exercise 2.48. 答案


  1. (define (make-segment v1 v2)
  2.   (cons v1 v2))

  3. (define (start-segment s)
  4.   (car s))

  5. (define (end-segment s)
  6.   (cdr s))
复制代码


用一下 cons,算是对上一题的补偿。

论坛徽章:
0
66 [报告]
发表于 2008-10-18 10:58 |只看该作者

Exercise 2.49.

Exercise 2.49.  Use segments->painter to define the following primitive painters:

a.  The painter that draws the outline of the designated frame.

b.  The painter that draws an ``X'' by connecting opposite corners of the frame.

c.  The painter that draws a diamond shape by connecting the midpoints of the sides of the frame.

d.  The wave painter.

论坛徽章:
0
67 [报告]
发表于 2008-10-18 11:31 |只看该作者

Exercise 2.49. 答案

这些图有个共同的模式---将若干个点连起来。所以我写了一个辅助函数,list->segment。应该叫 points->segments 才对,不过已经这样写了,不改了。


  1. (define (list->segment xs)
  2.   (define (f r x xs)
  3.     (if (null? xs) r
  4.         (f (cons (make-segment x (car xs)) r) (car xs) (cdr xs))))
  5.   (f '() (car xs) (cdr xs)))
复制代码



  • draw-frame

    1. (define draw-frame
    2.   (let ((v (list (make-vect 0 0)
    3.                  (make-vect 0 1)
    4.                  (make-vect 1 1)
    5.                  (make-vect 1 0)
    6.                  (make-vect 0 0))))
    7.     (segments->painter (list->segment v))))
    复制代码







  • "X"


    1. (define X
    2.   (let ((s1 (list->segment (list (make-vect 0 0)
    3.                                  (make-vect 1 1))))
    4.         (s2 (list->segment (list (make-vect 0 1)
    5.                                  (make-vect 1 0)))))
    6.     (segments->painter (append s1 s2))))
    复制代码



  • diamond

    1. (define diamond
    2.   (let ((v (list (make-vect 0 0.5)
    3.                  (make-vect 0.5 1)
    4.                  (make-vect 1 0.5)
    5.                  (make-vect 0.5 0)
    6.                  (make-vect 0 0.5))))
    7.     (segments->painter (list->segment v))))
    复制代码







  • wave

    1. (define wave
    2.   (let ((v1 (list (make-vect 0 26)
    3.                   (make-vect 6 17)
    4.                   (make-vect 12 25)
    5.                   (make-vect 14 21)
    6.                   (make-vect 10 0)))
    7.         (v2 (list (make-vect 16 0)
    8.                   (make-vect 21 13)
    9.                   (make-vect 25 0)))
    10.         (v3 (list (make-vect 31 0)
    11.                   (make-vect 25 19)
    12.                   (make-vect 41 6)))
    13.         (v4 (list (make-vect 41 15)
    14.                   (make-vect 31 27)
    15.                   (make-vect 25 27)
    16.                   (make-vect 27 35)
    17.                   (make-vect 25 41)))
    18.         (v5 (list (make-vect 16 41)
    19.                   (make-vect 14 35)
    20.                   (make-vect 16 27)
    21.                   (make-vect 12 27)
    22.                   (make-vect 6 25)
    23.                   (make-vect 0 35))))                  
    24.     (let ((segments (map (lambda (z) (list->segment
    25.                                      (map (lambda (x) (map (lambda (y) (/ y 41.0)) x)) z)))
    26.                         (list v1 v2 v3 v4 v5))))
    27.       (segments->painter (foldr append '() segments)))))
    复制代码









[ 本帖最后由 win_hate 于 2008-10-18 14:31 编辑 ]

论坛徽章:
0
68 [报告]
发表于 2008-10-18 14:28 |只看该作者

Exercise 2.50.

Exercise 2.50.  Define the transformation flip-horiz, which flips painters horizontally, and transformations that rotate painters counterclockwise by 180 degrees and 270 degrees.

论坛徽章:
0
69 [报告]
发表于 2008-10-18 14:29 |只看该作者

Exercise 2.50. 答案


  1. (define (flip-horiz painter)
  2.   (transform-painter painter
  3.                      (make-vect 1 0)
  4.                      (make-vect 0 0)
  5.                      (make-vect 1 1)))

  6. (define (rotate180 painter)
  7.   (transform-painter painter
  8.                      (make-vect 1 1)
  9.                      (make-vect 0 1)
  10.                      (make-vect 1 0)))

  11. (define (rotate270 painter)
  12.   (transform-painter painter
  13.                      (make-vect 0 1)
  14.                      (make-vect 0 0)
  15.                      (make-vect 1 1)))
复制代码

论坛徽章:
0
70 [报告]
发表于 2008-10-18 14:31 |只看该作者

Exercise 2.51.

Exercise 2.51.  Define the below operation for painters. Below takes two painters as arguments. The resulting painter, given a frame, draws with the first painter in the bottom of the frame and with the second painter in the top. Define below in two different ways -- first by writing a procedure that is analogous to the beside procedure given above, and again in terms of beside and suitable rotation operations (from exercise 2.50).
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP