求出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