练习2.41-练习2.47

1.练习2.41

(define (seprate-except x except)
  (filter (lambda (couple) 
            (let ((first (car couple))
                  (second (cadr couple)))
            (and (not (= first except))
                 (not (= second except))
                 (not (= first second)))))
          (map (lambda (n) (list n (- x n)))
               (enumerate-interval 1 (- x 1)))
          )
  )

(define (flatmap proc seq)
  (accumulate append '() (map proc seq)))

(define (seprate-to-three n)
  (flatmap (lambda (x) 
             (map (lambda (y) (cons x y)) 
                  (seprate-except (- n x) x)))
           (enumerate-interval 1 (- n 1)))
  )

2.练习2.42

(define empty-board '())

(define (adjoin-position new-row k rest-of-queens)
  (cons (list k new-row) rest-of-queens))

(define (safe? k positions)
  (define (check-safe col row rest-positions)
    (if (null? rest-positions)
        true
        (let ((first-position-col (car (car rest-positions)))
              (first-position-row (cadr (car rest-positions)))
              (remain-positions (cdr rest-positions)))
          (and (not (= col first-position-col))
               (not (= row first-position-row))
               (not (= (abs (- col first-position-col))
                       (abs (- row first-position-row))))
               (check-safe col row remain-positions)))))
  (if (null? positions)
      true
      (let ((col (car (car positions)))
            (row (cadr (car positions)))
            (rest (cdr positions)))
        (if (null? rest)
            true
            (check-safe col row rest)))))

3.练习2.43

因为重复计算k-1的皇后问题。

4.练习2.44

(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))

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

5.练习2.45

(define (split action1 action2)
  (lambda (painter n)
    (if (= n 0)
        painter
        (let ((smaller ((split action1 action2) painter (- n 1))))
          (action1 painter (action2 smaller smaller))))))

6.练习2.46
(define (make-vect x y)
  (cons x y))

(define (xcor-vect v)
  (car v))

(define (ycor-vect v)
  (cdr v))

(define (add-vect v1 v2)
  (make-vect (+ (xcor-vect v1)
                (xcor-vect v2))
             (+ (ycor-vect v1)
                (ycor-vect v2))))

(define (sub-vect v1 v2)
  (make-vect (- (xcor-vect v1)
                (xcor-vect v2))
             (- (ycor-vect v1)
                (ycor-vect v2))))

(define (scale-vect v s)
  (make-vect (* s (xcor-vect v))
             (* s (ycor-vect v))))
7.练习2.47

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

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

(define (origin-frame-list frame)
  (car frame))

(define (edge1-frame-list frame)
  (cadr frame))

(define (edge2-frame-list frame)
  (caddr frame))


(define (origin-frame-cons frame)
  (car frame))

(define (edge1-frame-cons frame)
  (cadr frame))

(define (edge2-frame-cons frame)
  (cddr frame))


发布了179 篇原创文章 · 获赞 1 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览