Blame


1 665c255d 2023-08-04 jrmu ;; Exercise 1.30. The sum procedure above generates a linear recursion. The procedure can be rewritten so that the sum is performed iteratively. Show how to do this by filling in the missing expressions in the following definition:
2 665c255d 2023-08-04 jrmu
3 665c255d 2023-08-04 jrmu (define (product term a next b)
4 665c255d 2023-08-04 jrmu (if (> a b)
5 665c255d 2023-08-04 jrmu 1
6 665c255d 2023-08-04 jrmu (* (term a)
7 665c255d 2023-08-04 jrmu (product term (next a) next b))))
8 665c255d 2023-08-04 jrmu
9 665c255d 2023-08-04 jrmu (define (product-iter term a next b)
10 665c255d 2023-08-04 jrmu (define (iter i result)
11 665c255d 2023-08-04 jrmu (if (> i b)
12 665c255d 2023-08-04 jrmu result
13 665c255d 2023-08-04 jrmu (iter (next i) (* (term i) result))))
14 665c255d 2023-08-04 jrmu (iter a 1))
15 665c255d 2023-08-04 jrmu
16 665c255d 2023-08-04 jrmu (define (factorial n)
17 665c255d 2023-08-04 jrmu (product (lambda (x) x)
18 665c255d 2023-08-04 jrmu 1
19 665c255d 2023-08-04 jrmu (lambda (x) (+ x 1))
20 665c255d 2023-08-04 jrmu n))
21 665c255d 2023-08-04 jrmu
22 665c255d 2023-08-04 jrmu (define (factorial-iter n)
23 665c255d 2023-08-04 jrmu (product-iter (lambda (x) x)
24 665c255d 2023-08-04 jrmu 1
25 665c255d 2023-08-04 jrmu (lambda (x) (+ x 1))
26 665c255d 2023-08-04 jrmu n))
27 665c255d 2023-08-04 jrmu
28 665c255d 2023-08-04 jrmu ;; pi/4 = 2*4*4*6*6*8*...
29 665c255d 2023-08-04 jrmu ;; ---------------
30 665c255d 2023-08-04 jrmu ;; 3*3*5*5*7*7*...
31 665c255d 2023-08-04 jrmu
32 665c255d 2023-08-04 jrmu (define (pi iterations)
33 665c255d 2023-08-04 jrmu (* 4.0
34 665c255d 2023-08-04 jrmu (product (lambda (x)
35 665c255d 2023-08-04 jrmu (if (odd? x)
36 665c255d 2023-08-04 jrmu (/ (+ x 1) (+ x 2))
37 665c255d 2023-08-04 jrmu (/ (+ x 2) (+ x 1))))
38 665c255d 2023-08-04 jrmu 1
39 665c255d 2023-08-04 jrmu (lambda (x) (+ x 1))
40 665c255d 2023-08-04 jrmu iterations)))
41 665c255d 2023-08-04 jrmu
42 665c255d 2023-08-04 jrmu (define (test-case actual expected)
43 665c255d 2023-08-04 jrmu (load-option 'format)
44 665c255d 2023-08-04 jrmu (newline)
45 665c255d 2023-08-04 jrmu (format #t "Actual: ~A Expected: ~A" actual expected))
46 665c255d 2023-08-04 jrmu
47 665c255d 2023-08-04 jrmu (test-case (factorial 0) 1)
48 665c255d 2023-08-04 jrmu (test-case (factorial 1) 1)
49 665c255d 2023-08-04 jrmu (test-case (factorial 2) 2)
50 665c255d 2023-08-04 jrmu (test-case (factorial 3) 6)
51 665c255d 2023-08-04 jrmu (test-case (factorial 4) 24)
52 665c255d 2023-08-04 jrmu (test-case (factorial 5) 120)
53 665c255d 2023-08-04 jrmu (test-case (factorial 6) 720)
54 665c255d 2023-08-04 jrmu (test-case (factorial 7) 5040)
55 665c255d 2023-08-04 jrmu (test-case (factorial-iter 7) 5040)
56 665c255d 2023-08-04 jrmu
57 665c255d 2023-08-04 jrmu (test-case (pi 10000) 3.1415)