Friday, March 22, 2019

SICP in Clojure: Chapter 1, Exercise 7

This is my Clojure solution to Chapter 1, Exercise 7:

(ns sicp.ch1.ex07
  (:require [sicp.ch1.ex06 :as sicp-ch1-ex06]))

(double (sicp-ch1-ex06/sqrt-iter 1 0.0001)) ; => 0.032... -- should
                                        ; be 0.01

(double (sicp-ch1-ex06/sqrt-iter 1 0.00001)) ; => 0.031... -- should
                                        ; be 0.0031...

(double (sicp-ch1-ex06/sqrt-iter 1 1000000)) ; => 1000 -- good

(defn good-enough?
  [guess prev-guess]
  (< (/ (Math/abs (double (- guess prev-guess))) guess) 0.001))

(defn sqrt-iter
  ([guess x]
   (sqrt-iter guess (inc guess) x))
  ([guess prev-guess x]
   (if (good-enough? guess prev-guess)
     guess
     (sqrt-iter (sicp-ch1-ex06/improve guess x)
                guess
                x))))

(double (sqrt-iter 1 0.0001)) ; => 0.01... -- good

(double (sqrt-iter 1 0.00001)) ; => 0.0031... -- better

(double (sqrt-iter 1 1000000)) ; => 1000 -- still good

No comments: