Sunday, June 14, 2020

SICP in Clojure: Chapter 1, Exercise 36

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

(ns sicp.ch1.ex36
  (:require [sicp.ch1.ex35 :as ch1-ex35]))

(defn try-guess
  [f guess]
  (let [next-guess (f guess)]
    (println (double next-guess))
    (if (ch1-ex35/close-enough? guess next-guess)
      next-guess
      (try-guess f next-guess))))

(defn fixed-point
  [f first-guess]
  (try-guess f first-guess))

(defn try-guess-with-avg-damping
  [f guess]
  (let [next-guess (f guess)]
    (println (double next-guess))
    (if (ch1-ex35/close-enough? guess next-guess)
      next-guess
      (try-guess-with-avg-damping f (/ (+ next-guess guess) 2)))))

(defn fixed-point-with-avg-damping
  [f first-guess]
  (try-guess-with-avg-damping f first-guess))

(double (fixed-point #(/ (Math/log 1000) (Math/log %))
                     1.1)) ; => 4.555538934848503 -- 38 steps

(double (fixed-point-with-avg-damping #(/ (Math/log 1000)
                                          (Math/log %))
                                      1.1))
                                        ; => 4.555533149860501 in 14
                                        ; steps
 

Thursday, June 11, 2020

SICP in Clojure: Chapter 1, Exercise 35

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

(ns sicp.ch1.ex35)

;; x = 1 + 1 / x
;; x^2 = x + 1
;; x^2 - x - 1 = 0
;; => use quadratic formula

(def tolerance 0.00001)

(defn close-enough?
  [v1 v2]
  (< (Math/abs (double (- v1 v2))) tolerance))

(defn try-guess
  [f guess]
  (let [next-guess (f guess)]
    (if (close-enough? guess next-guess)
      next-guess
      (try-guess f next-guess))))

(defn fixed-point
  [f first-guess]
  (try-guess f first-guess))

(double (fixed-point #(inc (/ 1 %)) 1)) ; => 1.618032786885246