]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ch2_2_3.rkt
Merge branch 'master' of github.com:vu3rdd/sicp
[sicp.git] / src / sicp / ch2_2_3.rkt
1 #lang racket/load
2 (require "utils.rkt")
3
4 (define (sum-odd-squares tree)
5   (cond 
6     ((null? tree) 0)
7     ((not (pair? tree)) 
8      (if (odd? tree) (square tree) 0))
9     (else (+ (sum-odd-squares (car tree))
10              (sum-odd-squares (cdr tree))))))
11                            
12 (define (even-fibs n)
13   (define (next k)
14     (if (> k n)
15         '()
16         (let ((f (fib k)))
17           (if (even? f)
18               (cons f (next (+ k 1)))
19               (next (+ k 1))))))
20   (next 0))
21
22 (define (filter pred? coll)
23   (cond 
24     ((empty? coll) '())
25     ((pred? (car coll)) (cons (car coll) (filter pred? (cdr coll))))
26     (else (filter pred? (cdr coll)))))
27
28 (define (accumulate op initial coll)
29   (if (null? coll)
30       initial
31       (op (car coll)
32           (accumulate op initial (cdr coll)))))
33
34 (define (enumerate-tree tree)
35   (cond 
36     ((null? tree) '())
37     ((not (pair? tree)) (list tree))
38     (else (append (enumerate-tree (car tree))
39                   (enumerate-tree (cdr tree))))))
40
41 (define (sum-odd-squares tree)
42   (accumulate +
43               0
44               (map square
45                    (filter odd?
46                            (enumerate-tree tree)))))
47
48 (define (even-fibs n)
49   (accumulate cons 
50               '()
51               (filter even?
52                       (map fib 
53                            (range 0 n)))))
54
55 (define (list-fib-squares n)
56   (accumulate cons
57               '()
58               (map square 
59                    (map fib 
60                         (range 0 n)))))
61
62 (define (product-of-squares-of-odd-elements coll)
63   (accumulate *
64               1
65               (map square
66                    (filter odd? coll))))
67