Thursday, May 23, 2019

SICP in Clojure: Chapter 1, Exercise 10

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

(ns sicp.ch1.ex10)

(defn A
  [x y]
  (cond (zero? y) 0
        (zero? x) (* 2 y)
        (= y 1) 2
        :else (A (dec x)
                 (A x (dec y)))))

(A 1 10) ; => 1024

(A 2 4) ; => 65536

(A 3 3) ; => 65536

(defn f
  [n]
  (A 0 n))

(defn g
  [n]
  (A 1 n))

(defn h
  [n]
  (A 2 n))

(every? #(= (* 2 %)
            (f %))
        (range 1 5)) ; => true -- f is multiplication

(every? #(= (Math/pow 2 %)
            (double (g %)))
        (range 1 5)) ; => true -- g is exponentiation

(every? (fn [i]
          (= (nth (iterate #(Math/pow 2 %) 1) i)
             (double (h i))))
        (range 1 5)) ; => true -- h is iterated exponentiation or tetration