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
(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