练习2.41-练习2.47

15 篇文章 0 订阅

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))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值