**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. 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 using the formula

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.

Part A:

Notice that the **product **function looks almost the same as **sum**. The only things truly different are the multiplication operation and the base case being multiplicative identity. **Factorial **doesn’t require much except the **identity **function and a trivial **next **function.

It’s easier to think about Wallis Product product if it’s written slightly differently:

$latex \frac{\pi}{4} = \frac{2}{3} \cdot \frac{4}{3} \cdot \frac{4}{5} \cdot \frac{6}{5} \cdot \frac{6}{7} \cdot \frac{8}{7} \cdots

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(define (product term a next b) (if (> a b) 1 (* (term a) (product term (next a) next b)))) (define (factorial n) (define (identity x) x) (define (next x) (+ 1 x)) (product identity 1 next n)) (define (wallis n) (define (next n) (+ n 1)) (define (term-num i) (if (even? i) (+ i 2) (+ i 1))) (define (term-den i) (if (even? i) (+ i 1) (+ i 2))) (define (fraction i) (/ (term-num i) (term-den i))) (* 4.0 (product fraction 1 next n))) |

> (wallis 5)

*2.9257142857142857*

> (wallis 50)

*3.1719440917427058*

> (wallis 500)

*3.1447232866889245*

> (wallis 5000)

*3.1419067029355268*

> (wallis 10000)

*3.1417497057380523*

While the results do tend to they do so very slowly.

Part B:

This is the iterative version of product. It looks similar to the iterative version of sum.

1 2 3 4 5 6 7 8 9 10 11 12 13 |
(define (wallis n) (define (next n) (+ n 1)) (define (term-num i) (if (even? i) (+ i 2) (+ i 1))) (define (term-den i) (if (even? i) (+ i 1) (+ i 2))) (define (fraction i) (/ (term-num i) (term-den i))) (* 4.0 (product-iter fraction 1 next n))) (define (product-iter term a next b) (define (iter a result) (if (> a b) result (iter (next a) (* (term a) result)))) (iter a 1)) |