sicp-solutions/ex-1.33.scm

39 lines
1.1 KiB
Scheme

#lang sicp
(define (filtered-accumulate combiner
null-value
term
a
next
b
pred?)
(define (iter a result)
(cond ((> a b) result)
((pred? a) (iter (next a)
(combiner result (term a))))
(else (iter (next a) result))))
(iter a null-value))
(define (square x) (* x x))
(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))
(define (prime? n)
(= n (smallest-divisor n)))
(define (prime-square-sum a b)
(filtered-accumulate + 0 square a inc b prime?))
(define (gcd a b)
(if (= b 0)
a
(gcd b (remainder a b))))
(define (rel-prime-product n)
(define (rel-prime-n? i)
(= (gcd i n) 1))
(filtered-accumulate * 1 identity 1 inc n rel-prime-n?))