#
Higher-order procedures
^{
}

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
`product`

. Also use this procedure to compute approximations to
`π`

using the formula

```
π 2·4·4·6·6·8···
- = --------------
4 3·3·5·5·7·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 (inc n) (+ n 1))
(define (square x) (* x x))
(define (identity x) x)
(check-equal? (product square 1 inc 3) 36)
(check-equal? (product identity 3 inc 5) 60)
(check-equal? (factorial 5) 120)
```