**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

$$ \frac{\pi}{4} = \frac{2\cdot4\cdot4\cdot6\cdot6\cdot8\cdots}{3\cdot3\cdot5\cdot5\cdot7\cdot7\cdots} $$

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:

$$ \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 $$

```
(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 \( \pi \) they do so very slowly.

## Part B

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

```
(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))
```