牛頓平方根

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章