weima learns to program

my attempt to do the exercises in sicp.

Sunday, June 29, 2008

sicp exercise 1.31

;  Exercise 1.31.
;  a. The sum procedure is only the simplest of a vast number of similar abstractions that can be captured
;  as higher-order procedures.51 Write an analogous procedure called product that returns the product of
;  the values of a function at points over a given range. Show how to define factorial in terms of product.
;  Also use product to compute approximations to pie using the formula
;
;  pi/4 = 2/3.4/3.4/5.6/5.6/7 ....
;
;  b. If your product procedure generates a recursive process, write one that generates an iterative
;  process.  If it generates an iterative process, write one that generates a recursive process.

(define (prod-recur term a next b)
(if (> a b)
1
(* (term a)
(prod-recur term (next a) next b))))

(define (prod-iter term a next b)
(define (prod-iter-impl term a next b res)
(if (> a b)
res
(prod-iter-impl term (next a) next b (* (term a) res))))
(prod-iter-impl term a next b 1))

(define (fact n)
(define (next x) (+ x 1))
(define (term x) x)
(prod-iter term 1 next n))

;(display (fact 500)) (newline)

(define (pi)
(define (next x) (+ x 1))
(define (term x)
(cond ((even? x) (/ x (+ x 1)))
(else (/ (+ x 1) x))))
(* (prod-iter term 2 next 1000) 4))

(display (rationalize (pi) 0.000001)) (newline)