Exercise 1.31

Imports: [[Chapter 1.3]] identity inc

  • Recursive:
(define (product term a next b)
  (if (> a b)
      1
      (* (term a)
         (product term (next a) next b))))
  • Iterative:
    (define (product term a next b)
      (define (iter a acc)
        (if (> a b)
            acc
            (iter (next a) (* acc (term a)))))
      (iter a 1))
    ```

Calculating factorials and approximating $\pi$ using  `product`:

```scheme
(define (factorial n)
  (product identity 1 inc n))

(factorial 5) => 120
(factorial 7) => 5040

(define (approx-pi n)
  (define (term k)
    (let ((r (remainder k 2)))
      (/ (+ k 2 (- r))
         (+ k 1 r))))
  (* 4 (product term 1.0 inc n)))

(approx-pi 00010) ~> 3.2751010413348065
(approx-pi 00100) ~> 3.1570301764551654
(approx-pi 01000) ~> 3.1431607055322552
(approx-pi 10000) ~> 3.1417497057380084