-
Notifications
You must be signed in to change notification settings - Fork 1
/
Exercise 1.38 Euler's Expansion.rkt
executable file
·113 lines (99 loc) · 3.35 KB
/
Exercise 1.38 Euler's Expansion.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#lang racket
; Exercise 1.38. In 1737, the Swiss mathematician Leonhard Euler published a memoir De
; Fractionibus Continuis, which included a continued fraction expansion for e - 2, where e
; is the base of the natural logarithms. In this fraction, the Ni are all 1, and the Di
; are successively 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, .... Write a program that uses your
; cont-frac procedure from exercise 1.37 to approximate e, based on Euler's expansion.
; SOLUTION
; (a) Recursive
(define (cont-frac-recur n d k)
(define (cont-frac-recur-internal n d k i)
(if (< i k)
(/ (n i) (+ (d i) (cont-frac-recur-internal n d k (+ i 1))))
(/ (n i) (d i))
)
)
(cont-frac-recur-internal n d k 1)
)
; (b) Iterative
(define (cont-frac-iter n d k)
; No deferred calcualtions so we need to work in the reverse direction to the
; recursive process
(define (basic-op a b c)
(+ a (/ b c))
)
(define (cont-frac-iter-internal n d iters accumulator)
(cond
((= iters k) (cont-frac-iter-internal n d (- iters 1) (basic-op (d (- k 1)) (n k) (d k))))
((and (< iters k) (> iters 1)) (cont-frac-iter-internal n d (- iters 1) (basic-op (d (- iters 1)) (n iters) accumulator)))
((= iters 1) (/ (n 1) accumulator))
)
)
(cont-frac-iter-internal n d k 0)
)
(define (euler-d-term n)
(cond
((= 0 (remainder n 3)) 1)
((= 1 (remainder n 3)) 1)
((= 2 (remainder n 3)) (* 2 (+ (/ (- n 2) 3) 1)))
((= n 2) 2)
((= n 1) 1)
)
)
; Tests
(cont-frac-recur (lambda (i) 1.0) euler-d-term 1)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 2)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 3)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 4)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 5)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 6)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 7)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 8)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 0)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 10)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 15)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 20)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 50)
(cont-frac-recur (lambda (i) 1.0) euler-d-term 100)
1.0
0.6666666666666666
0.75
0.7142857142857143
0.71875
0.717948717948718
0.7183098591549296
0.7182795698924731
1.0
0.7182817182817183
0.7182818284705836
0.7182818284590452
0.7182818284590453
0.7182818284590453
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 1)
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 2)
0.6666666666666666
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 3)
0.75
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 4)
0.7142857142857143
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 5)
0.71875
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 6)
0.717948717948718
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 7)
0.7183098591549296
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 8)
0.7182795698924731
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 9)
0.7182835820895522
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 10)
0.7182817182817183
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 20)
0.7182818284590452
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 50)
0.7182818284590453
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 100)
0.7182818284590453
> (cont-frac-iter (lambda (i) 1.0) euler-d-term 10000)
0.7182818284590453
>