conventional-interface
; Sum of squares of odd tree leaves
(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))))))
(sum-odd-squares
(list 1
(list 2 (list 3 4) 5)
(list 6 7))) ;Value: 84 (1 + 9 + 25 + 49)
; Even fibonacci numbers
(define (fib n)
(define (iter a b count)
(if (= count 0)
b
(iter (+ a b) a (- count 1))))
(iter 1 0 n))
(define nil '())
(define (even-fibs n)
(define (next k)
(if (> k n)
nil
(let ((f (fib k)))
(if (even? f)
(cons f (next (+ k 1)))
(next (+ k 1))))))
(next 0))
(even-fibs 10) ; (0 2 8 34)
; Sequence operations
; Defining filter
(define (fitler predicate sequence)
(cond ((null? sequence) nil)
((predicate (car sequence))
(cons (car sequence)
(filter predicate (cdr sequence))))
(else (filter predicate sequence))))
(filter odd? (list 1 2 3 4 5 6)) ; (1 3 5)
; Defining accumulation
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence) (accumulate op initial (cdr sequence)))))
(accumulate + 0 (list 1 2 3 4)) ;Value: 10
(accumulate * 1 (list 1 2 3 4)) ;Value: 24
(accumulate cons nil (list 1 2 3 4 5)) ;(1 2 3 4 5)
; Enumerating integers
(define (enumarate-interval low high)
(if (> low high)
nil
(cons low (enumarate-interval (+ low 1) high))))
(enumarate-interval 2 7) ; (2 3 4 5 6 7)
; Enumerating tree
(define (enumerate-tree tree)
(cond ((null? tree) nil)
((not (pair? tree)) (list tree))
(else (append (enumerate-tree (car tree))
(enumerate-tree (cdr tree))))))
(enumerate-tree (list 1 (list 2 (list 3 4)) 5)) ; (1 2 3 4 5)
; Rewriting `sum-odd-squares`
(define (sum-odd-squares tree)
(accumulate
+
0
(map square (filter odd? (enumerate-tree tree)))))
(sum-odd-squares
(list 1
(list 2 (list 3 4) 5)
(list 6 7))) ;Value: 84
; Rewriting `even-fibs`
(define (even-fibs k)
(accumulate
cons
nil
(filter even? (map fib (enumarate-interval 0 k)))))
(even-fibs 10) ; (0 2 8 34)
(define (list-fib-squares n)
(accumulate
cons
nil
(map square (map fib (enumarate-interval 0 n)))))
(list-fib-squares 10) ; (0 1 1 4 9 25 64 169 441 1156 3025)