-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2.41.rkt
79 lines (60 loc) · 1.75 KB
/
2.41.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
#lang sicp
(define (smallest-divisor n)
(find-divisor n 2))
(define (square x)
(* x x))
(define (find-divisor n test-divisor)
(cond ((> (square test-divisor) n) n)
(( divides? test-divisor n) test-divisor)
(else (find-divisor n (+ test-divisor 1)))))
(define (divides? a b)
(= (remainder b a) 0))
(define (prime? n)
(= n (smallest-divisor n)))
(define (accumulate f acc seq)
(if (null? seq)
acc
(f (car seq)
(accumulate f acc (cdr seq)))))
(define (filter predicate sequence)
(cond ((null? sequence) nil)
((predicate (car sequence))
(cons (car sequence)
(filter predicate (cdr sequence))))
(else (filter predicate (cdr sequence)))))
(define (append list1 list2)
(if (null? list1) list2
(cons (car list1) (append (cdr list1) list2))))
(define (double x) (* x 2))
(define (enumerate-interval low high)
(if (> low high)
nil
(cons low (enumerate-interval (+ low 1) high))))
(define (map proc items)
(if (null? items)
nil
(cons (proc (car items))
(map proc (cdr items)))))
(define (flatmap proc seq)
(accumulate append nil (map proc seq)))
(define (unique-pairs n)
(flatmap
(lambda (i)
(map (lambda (j) (list j i))
(enumerate-interval 1 (- i 1))))
(enumerate-interval 1 n)))
(newline)
(define (unique-triples n)
(flatmap
(lambda (i)
(map (lambda (j) (append j (list i)))
(unique-pairs (- i 1))))
(enumerate-interval 1 n)))
(define (unique-triples-with-sum-s s)
(filter
(lambda (triple)
(= (accumulate + 0 triple) s)) (unique-triples (- s 3))))
(display (unique-triples 9))
(newline)
(display (unique-triples-with-sum-s 9))
(newline)