Wednesday, March 20, 2019

SICP in Clojure: Chapter 1, Exercise 6

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

(ns sicp.ch1.ex06)

(defn good-enough?
  [guess x]
  (< (Math/abs (- (Math/pow guess 2) x)) 0.001))

(defn average
  [x y]
  (/ (+ x y) 2))

(defn improve
  [guess x]
  (average guess (/ x guess)))

(defn sqrt-iter
  [guess x]
  (if (good-enough? guess x)
    guess
    (sqrt-iter (improve guess x)
               x)))

(double (sqrt-iter 1 2)) ; => 1.41421568627451

(defn new-if
  [predicate then-clause else-clause]
  (cond predicate then-clause
        :else else-clause))

(new-if (= 2 3) 0 5) ; => 5

(new-if (= 1 1) 0 5) ; => 0

(defn new-sqrt-iter
  [guess x]
  (new-if (good-enough? guess x)
          guess
          (new-sqrt-iter (improve guess x)
                         x)))

(new-sqrt-iter 1 2) ; => infinite loop

No comments: