Skip to content

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)