-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2-2.rkt
285 lines (199 loc) · 5.97 KB
/
2-2.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#lang sicp
;SICP 2.2 heirarchical data and the closure property
(cons (cons 1 2)
(cons 3 4))
(cons (cons 1
(cons 2 3))
4)
(cons 1
(cons 2
(cons 3
(cons 4 null))))
(list 1 2 3 4)
; In general,
; (list <a1> <a2> ... <an>)
; is equivalent to
; (cons <a1> (cons <a2> (cons ... (cons <an> nil) ...)))
(define one-through-four (list 1 2 3 4))
(car one-through-four)
(cdr one-through-four)
(car (cdr one-through-four))
(cons 10 one-through-four)
(cons 5 one-through-four)
; list operations
(define (list-ref items n)
(if (= n 0)
(car items)
(list-ref (cdr items) (- n 1))))
(define squares (list 1 4 9 16 25))
(list-ref squares 3)
(define (length items)
(if (null? items)
0
(+ 1 (length (cdr items)))))
(define odds (list 1 3 5 7))
(length odds)
(define (lengthiter items)
(define (length-iter a count)
(if (null? a)
count
(length-iter (cdr a) (+ 1 count))))
(length-iter items 0))
(append squares odds)
(append odds squares)
(define (append list1 list2)
(if (null? list1)
list2
(cons (car list1) (append (cdr list1) list2))))
; mapping over lists
(define (scale-list1 items factor)
(if (null? items)
null
(cons (* (car items) factor)
(scale-list1 (cdr items) factor))))
(scale-list1 (list 1 2 3 4 5) 10)
(define (map proc items)
(if (null? items)
null
(cons (proc (car items))
(map proc (cdr items)))))
(map abs (list -10 2.5 -11.6 17))
(map (lambda (x) (* x x))
(list 1 2 3 4))
(define (scale-list items factor)
(map (lambda (x) (* x factor))
items))
(scale-list (list 1 2 3 4 5) 10)
; 2.21
(define (square n)
(* n n))
(define (square-list items)
(if (null? items)
items
(cons (square (car items))
(square-list (cdr items)))))
(define (square-list2 items)
(map (lambda (x) (square x)) items))
(check-equal? (square-list '(1 2 3 4)) '(1 4 9 16))
(check-equal? (square-list2 '(1 2 3 4)) '(1 4 9 16))
; heirarchical structures
(cons (list 1 2) (list 3 4))
(define x (cons (list 1 2) (list 3 4)))
(define (count-leaves x)
(cond ((null? x) 0)
((not (pair? x)) 1)
(else (+ (count-leaves (car x))
(count-leaves (cdr x))))))
(length x)
(count-leaves x)
(list x x)
(length (list x x))
(count-leaves (list x x))
; mapping over trees
(define (scale-tree1 tree factor)
(cond ((null? tree) null)
((not (pair? tree)) (* tree factor))
(else (cons (scale-tree1 (car tree) factor)
(scale-tree1 (cdr tree) factor)))))
(scale-tree1 (list 1 (list 2 (list 3 4) 5) (list 6 7))
10)
(define (scale-tree tree factor)
(map (lambda (sub-tree)
(if (pair? sub-tree)
(scale-tree sub-tree factor)
(* sub-tree factor)))
tree))
; sequences as conventional interfaces
(define (square n)
(* n n))
(define (sum-odd-squares tree)
(cond ((null? tree) 0)
((not (pair? tree))
(if (odd? tree) (square tree) 0))
(else (+ (sum-odd-squares (car tree))
(sum-odd-squares (cdr tree))))))
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
(define (even-fibs n)
(define (next k)
(if (> k n)
null
(let ((f (fib k)))
(if (even? f)
(cons f (next (+ k 1)))
(next (+ k 1))))))
(next 0))
; programs look different but are actually very similar
; enumerate: tree leaves --> filter: odd? --> map: square --> accumulate: +, 0
; enumerate: integers --> map: fib --> filter: even? --> accumulate: cons, ()
; the similarities are not evident because of the way that each program implements enumeration and spreads the distinct parts of the signal-flow throughout different parts of the individual programs
; sequence operations
(define (fib n)
(if (<= n 2)
1
(+ (fib (- n 1))
(fib (- n 2)))))
(define (square n)
(* n n))
(map square (list 1 2 3 4 5))
; filtering a sequence to select only those elements that satisfy a given predicate is accomplished by:
(define (filter predicate sequence)
(cond ((null? sequence) null)
((predicate (car sequence))
(cons (car sequence)
(filter predicate (cdr sequence))))
(else (filter predicate (cdr sequence)))))
(filter odd? (list 1 2 3 4 5))
; accumulations can be implemented by
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence)))))
(accumulate + 0 (list 1 2 3 4 5))
(accumulate * 1 (list 1 2 3 4 5))
(accumulate cons null (list 1 2 3 4 5))
(define (enumerate-interval low high)
(if (> low high)
null
(cons low (enumerate-interval (+ low 1) high))))
(trace enumerate-interval)
(enumerate-interval 2 7)
(define (enumerate-tree tree)
(cond ((null? tree) null)
((not (pair? tree)) (list tree))
(else (append (enumerate-tree (car tree))
(enumerate-tree (cdr tree))))))
(define (sum-odd-squares tree)
(accumulate +
0
(map square
(filter odd?
(enumerate-tree tree)))))
(define (even-fibs n)
(accumulate cons
null
(filter even?
(map fib
(enumerate-interval 0 n)))))
(define (list-fib-squares n)
(accumulate cons
null
(map square
(map fib
(enumerate-interval 0 n)))))
(list-fib-squares 10)
(define (product-of-squares-of-odd-elements sequence)
(accumulate *
1
(map square
(filter odd? sequence))))
(product-of-squares-of-odd-elements (list 1 2 3 4 5))
(define (salary-of-highest-paid-programmer records)
(accumulate max
0
(map salary
(filter programmer? records))))