天天看点

SICP学习笔记5 ex2.17 -- ex2.23

; ex2.17
(define (last-pair l)
  (if (null? (cdr l))
      l
      (last-pair (cdr l))))

; ex2.18
(define (my_reverse l)
  (if (null? (cdr l))
      l
      (append (my_reverse (cdr l)) (list (car l)))))

; ex2.19
(define us-coins (list 50 25 10 5 1))
(define uk-coins (list 100 50 20 10 5 2 1 0.5))
(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 (no-more? coin-values)
  (null? coin-values))
(define (except-first-denomination coin-values)
  (cdr coin-values))
(define (first-denomination coin-values)
  (car coin-values))
; ex2.20
(define (same-parity . l)
  (define (same-parity-p parity l)
    (if (null? l)
        null
        (if (= parity (remainder (car l) 2)) 
            (cons  (car l) (same-parity-p parity (cdr l)))
            (same-parity-p parity (cdr l)))))
  (same-parity-p (remainder (car l) 2) l))


;ex2.11
(define (square-list-r items)
  (if (null? items)
      null
      (cons (square (car items))
            (square-list-r (cdr items)))))
(define (square-list-map items)
  (map (lambda (x) (* x x))
       items))

;ex2.22
(define (square-list-i items)
  (define (iter things answer)
    (if (null? things)
        answer
        (iter (cdr things)
              (append answer
                     (list (square (car things)))))))
 (iter items null))

;ex2.23
(define (my-for-each f l)
  (if (null? l)
      (newline)
      (begin (f (car l))
           (my-for-each f (cdr l)))))