Skip to content

Commit a8e0f2a

Browse files
committed
add ex-2.40
1 parent e84c58a commit a8e0f2a

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

SICP/chapter-02/ex-2.40.rkt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#lang sicp
2+
3+
(define (filter predicate sequence)
4+
(cond ((null? sequence) nil)
5+
((predicate (car sequence))
6+
(cons (car sequence)
7+
(filter predicate (cdr sequence))))
8+
(else (filter predicate (cdr sequence)))))
9+
10+
(define (accumulate op initial sequence)
11+
(if (null? sequence)
12+
initial
13+
(op (car sequence)
14+
(accumulate op initial (cdr sequence)))))
15+
16+
(define (enumerate-interval low high)
17+
(if (> low high)
18+
nil
19+
(cons low (enumerate-interval (+ low 1) high))))
20+
21+
(define (square x) (* x x))
22+
(define (even? n)
23+
(= (remainder n 2) 0))
24+
25+
(define (smallest-divisor n)
26+
(find-divisor n 2))
27+
28+
(define (find-divisor n test-divisor)
29+
(cond ((> (square test-divisor) n) n)
30+
((divides? test-divisor n) test-divisor)
31+
(else (find-divisor n (+ test-divisor 1)))))
32+
33+
(define (divides? a b)
34+
(= (remainder b a) 0))
35+
36+
(define (prime? n)
37+
(= n (smallest-divisor n)))
38+
39+
(define (flatmap proc seq)
40+
(accumulate append nil (map proc seq)))
41+
42+
(define (prime-sum? pair)
43+
(prime? (+ (car pair) (cadr pair))))
44+
45+
(define (make-pair-sum pair)
46+
(list (car pair) (cadr pair) (+ (car pair) (cadr pair))))
47+
48+
;; unique-pairs
49+
(define (unique-pairs n)
50+
(flatmap (lambda (i)
51+
(map (lambda (j) (list i j))
52+
(enumerate-interval 1 (- i 1))))
53+
(enumerate-interval 1 n)))
54+
55+
(define (prime-sum-pairs n)
56+
(map make-pair-sum
57+
(filter prime-sum?
58+
(unique-pairs n))))
59+
60+
(display (prime-sum-pairs 6))

0 commit comments

Comments
 (0)