Wednesday, August 28, 2019

SICP in Clojure: Chapter 1, Exercise 20

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

(ns sicp.ch1.ex20)

(defn gcd-pseudo-normal
  [a b]
  (if-not (and (ifn? a) (ifn? b))
    (gcd-pseudo-normal #(identity a) #(identity b))
    (if (zero? (b))
      (a)
      (gcd-pseudo-normal b #(do
                              (println "Computing remainder")
                              (rem (a) (b)))))))

(defn gcd
  [a b]
  (if (zero? b)
    a
    (gcd b (do
             (println "Computing remainder")
             (rem a b)))))

(gcd-pseudo-normal (constantly 206)
                   (constantly 40)) ; => 18 remainder computations

(gcd 206 40) ; => 4 remainder computations

No comments: