Chapter 2.2.1
Exercise 2.17
(define (last-pair ls) (if (null? (cdr ls)) (car ls) (last-pair (cdr ls))))
Exercise 2.18
(define (rev ls)
(define (iter ls re)
(if (null? (cdr ls))
(cons (car ls) re)
(iter (cdr ls) (cons (car ls) re))))
(iter (cdr ls) (cons (car ls) '())))
Exercise 2.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)
(define (first-denomination coin) (car coin))
(define (no-more? coin) (null? coin))
(define (except-first-denomination coin) (cdr coin))
(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)))))
Exercise 2.20
;排他的論理和を用いればもっと簡単に書ける
(define (same-parity x . z)
(define (same-odd ls)
(if (null? ls)
'()
(if (odd? (car ls))
(cons (car ls) (same-odd (cdr ls)))
(same-odd (cdr ls)))))
(define (same-even ls)
(if (null? ls)
'()
(if (even? (car ls))
(cons (car ls) (same-even (cdr ls)))
(same-even (cdr ls)))))
(if (odd? x) (cons x (same-odd z)) (cons x (same-even z))))
Exercise 2.21
(define (square x) (* x x))
(define (square-list1 items)
(if (null? items)
'()
(cons (square (car items)) (square-list1 (cdr items)))))
(define (square-list2 items) (map square items))
Exercise 2.22
Exercise 2.23
(define (for-each1 proc items)
(if (null? items)
#t
(begin (proc (car items)) (for-each proc (cdr items)))))