(define (accumulate op init seq)
(if (null? seq)
init
(op (car seq) (accumulate op init (cdr seq)))))
(define (accumulate-n op init seq)
(if (null? (car seq))
'()
(cons (accumulate op init (map car seq))
(accumulate-n op init (map cdr seq)))))
(define ei enumerate-interval)
(define m2.37 (list (ei 1 4) (append (ei 4 6) '(6)) (ei 6 9)))
(define (dot-product v w)
(accumulate + 0 (map * v w)))
(define (matrix-*-vector m v)
(map (lambda (xs) (map * v xs)) m))
(define (matrix-*-vector m v)
(map (lambda (xs) (dot-product xs v)) m))
(define (traspose mat)
(accumulate-n (lambda (x y) (cons x y)) '() mat))
(define (matrix-*-mat m n)
(let ((cols (traspose n)))
(map (lambda (x) (matrix-*-vector cols x)) m)))
(define x '((1 2) (3 4)))
(define y '((1 10) (100 1000)))
(define (fold-left op initial sequence)
(define (iter result rest)
(if (null? rest)
result
(iter (op result (car rest))
(cdr rest ))))
(iter initial sequence))
(define (fold-right op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(fold-right op initial (cdr sequence)))))
(define (reverse-r sequence)
(fold-right (lambda (x y) (append y (list x))) '() sequence))
(define (reverse-l sequence)
(fold-left (lambda (x y) (cons y x)) '() sequence))
(define (recur-reverse lst)
(if (null? lst)
'()
(append (recur-reverse (cdr lst))
(list (car lst)))))
(define (prime? n)
(define (smallest-divisor n)
(find-divisor n 2))
(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))
(= n (smallest-divisor n)))
(define (square x) (* x x))
(define (flatmap proc seq)
(accumulate append '() (map proc seq)))
(define (prime-sum? pair)
(prime? (+ (car pair) (cadr pair))))
(define (make-pair-sum pair)
(let ((l (car pair))
(r (cadr pair)))
(list l r (+ l r))))
(define (prime-sum-pairs n)
(map make-pair-sum
(filter prime-sum?
(flatmap
(lambda (i)
(map (lambda (j) (list i j))
(enumerate-interval 1 (- i 1))))
(enumerate-interval 1 n)))))
(define (list-fib-squares n)
(accumulate cons
'()
(map square
(map fib
(enumerate-interval 0 n)))))
(define (fib n)
(define (f next result count)
(if (= count 0)
result
(f (+ next result) next (- count 1))))
(f 1 0 n))