求出y和x/y的平均值,然後再進行計算,直到計算的值與目標的差值的絕對值小於預先給定的值,該近似值即爲所求
(defn avg [& args]
(/ (apply + args) (count args)))
(defn improve [guess x]
(avg guess (/ x guess)))
(defn good-enough? [guess x]
(< (Math/abs (- (* guess guess) x)) 0.001))
(defn sqrt-iter [guess x]
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(defn new-if [p x y]
(cond
p x
:default y))
(defn sqrt [x]
(sqrt-iter 1.0 x))
(defn new-if [p x y]
(cond
p x
:default y))
(defn new-sqrt-iter [guess x]
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(defn new-sqrt [x]
(new-sqrt-iter 1.0 x))
實驗
user=>
(sqrt 9)
3.00009155413138
user=>
(sqrt (+ 100 37))
11.704699917758145
user=>
(new-sqrt 9)
3.00009155413138
user=>
(new-sqrt 137)
11.704699917758145
user=>
user=>
(Math/sqrt 9)
3.0
user=>
(Math/sqrt 137)
11.704699910719626