]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ch1_1.clj
Solution to 4.33. This had been difficult to get right, though conceptually it was
[sicp.git] / src / sicp / ch1_1.clj
1 (ns sicp.ch1-1
2   (:use sicp.utils))
3
4 (defn sum-of-squares [x y]
5   (+ (square x) (square y)))
6
7 (defn ff [a]
8   (sum-of-squares (+ a 1) (* a 2)))
9
10 (defn abs1 [x]
11   (cond (< x 0) (- x)
12         :else x))
13
14 ;; 1.1.7 Square root finding using Newton's method
15 (defn average [x y]
16   (/ (+ x y) 2))
17
18 (defn improve [guess x]
19   (average guess (/ x guess)))
20
21 (defn good-enough? [guess x]
22   (< (myabs (- (square guess) x)) 0.001))
23
24 (defn sqrt-iter [guess x]
25   (if (good-enough? guess x)
26     guess
27     (sqrt-iter (improve guess x)
28                x)))
29
30 (defn sqrt [x]
31   (sqrt-iter 1.0 x))
32
33
34 ;; An alternative strategy for implementing good-enough? is to watch how guess
35 ;; changes from one iteration to the next and to stop when the change is a very
36 ;; small fraction of the guess.
37 (defn sqrt-iter [old-guess new-guess x]
38   (if (good-enough? old-guess new-guess x)
39     new-guess
40     (sqrt-iter new-guess (improve new-guess x)
41                x)))
42
43 (defn improve [guess x]
44   (average guess (/ x guess)))
45
46 (defn average [x y]
47   (/ (+ x y) 2))
48
49 (defn good-enough? [old-guess new-guess x]
50   (< (/ (myabs (- new-guess old-guess)) new-guess) 0.0001))
51
52 (defn sqrt [x]
53   (sqrt-iter x 1.0 x))
54 (comment
55 user> (sqrt (square 0.01))
56 0.010000000025490743
57 user> (sqrt (square 0.001))
58 0.0010000000000000117
59 user> (sqrt (square 0.0001))
60 1.0000000000082464E-4
61 user> (sqrt (square 0.02))
62 0.020000000050877154
63 user> (sqrt (square 0.002))
64 0.0020000000000000235
65 user> (sqrt (square 4))
66 4.000000000000051
67 user> (sqrt (square 20))
68 20.000000000298428
69 user> (sqrt (square 25))
70 25.000000063076968
71 user> (sqrt 5)
72 2.236067977499978
73 user> (sqrt 25)
74 5.000000000053722
75 user> (sqrt 9)
76 3.000000001396984
77 user> (sqrt 81)
78 9.000000000007091
79 )
80
81 ;; section 1.1.8
82 ;; hiding the non-public procedure definitions
83 (defn- sqrt-iter [guess x]
84   (if (good-enough? guess x)
85     guess
86     (sqrt-iter (improve guess x)
87                x)))
88
89 (defn- improve [guess x]
90   (average guess (/ x guess)))
91
92 (defn- average [x y]
93   (/ (+ x y) 2))
94
95 (defn- good-enough? [guess x]
96   (< (myabs (- (square guess) x)) 0.001))
97
98 (defn sqrt [x]
99   (sqrt-iter 1.0 x))