sicp 习题 2.17 ~ 2.20

2.17
(define (my-last-pair l)
  (if (null? (cdr l))
      (car l)
      (last-pair (cdr l))))

(my-last-pair (list 23 72 149 34))


2.18
(define (my-reverse l)
  (if (or (null? l) (= (length l) 1))
      l
      (append (my-reverse (cdr l)) (list (car l)))))

(my-reverse (list 23 72))

(my-reverse (list 23 72 149 34))


2.19
(define (no-more? coin-values)
  (or (< (length coin-values) 0) (= (length coin-values) 0)))

(define (except-first-denomination coin-values)
  (cdr coin-values))

(define (first-denomination coin-values)
  (car coin-values))

(define (cc amount coin-values)
  (cond ((= amount 0) 1)
        ((or (< amount 0) (no-more? coin-values)) 0)
        (else
         (+ (cc amount
                (except-first-denomination coin-values))
            (cc (- amount
                   (first-denomination coin-values))
                coin-values)))))

(define us-coins (list 50 25 10 5 1))
(define uk-coins (list 100 50 20 10 5 2 1 0.5))

(cdr us-coins)
(car us-coins)

(cc 100 us-coins)


2.20
(define (odd-list l)
  (cond ((or (null? l) (< (length l) 0) (= (length l) 0)) l)
        ((odd? (car l)) (append (list (car l)) (odd-list (cdr l))))
        (else (odd-list (cdr l)))))

(define (even-list l)
  (cond ((or (null? l) (< (length l) 0) (= (length l) 0)) l)
        ((even? (car l)) (append (list (car l)) (even-list (cdr l))))
        (else (even-list (cdr l)))))

(odd-list (list 1 2 3 4 5 6 7))
(even-list (list 1 2 3 4 5 6 7))

(define same-parity (lambda (n . l)
  (if (odd? n)
      (append (list n) (odd-list l))
      (append (list n) (even-list l)))))


(same-parity (list 1 2 3 4 5 6 7))

你可能感兴趣的:(SICP)