-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsection-2.2.1.rkt
75 lines (56 loc) · 1.51 KB
/
section-2.2.1.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#lang sicp
; ex 2.17
; Can't handle empty list
(define (last-pair xs)
(cond
[(null? (cdr xs)) (car xs)]
[else (last-pair (cdr xs))]))
; ex 2.18
(define (reverse xs)
(let loop ([ys xs]
[accu '()])
(if (null? ys)
accu
(loop (cdr ys) (cons (car ys) accu)))))
; ex 2.19
(define us-coins (list 1 25 50 5 10))
(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))
; Order doesn't matter.
; ex 2.20
(define (same-parity x . xs)
(define (loop x xs)
(cond
((null? xs) '())
((= (remainder (+ x (car xs)) 2) 0) (cons (car xs) (loop x (cdr xs))))
(else (loop x (cdr xs)))))
(cons x (loop x xs)))
; ex 2.21
(define (square n) (* n n))
(define (square-list-v1 items)
(if (null? items)
'()
(cons (square (car items)) (square-list-v1 (cdr items)))))
(define (square-list-v2 items)
(map square items))
; ex 2.23
(define (for-each proc xs)
(cond
((null? xs) '())
(else (proc (car xs)) (for-each proc (cdr xs)))))