Tuesday, August 20, 2019

SICP in Clojure: Chapter 1, Exercise 17

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

(ns sicp.ch1.ex17)

(defn multiply
  [a b]
  (if (zero? b)
    0
    (+ a (multiply a (dec b)))))

(multiply 5 8) ; => 40

(defn double-it
  [n]
  (* 2 n))

(defn halve-it
  [n]
  (/ n 2))

(defn fast-multiply
  [a b]
  (cond (zero? b) 0
        (= b 1) a
        (even? b) (double-it (fast-multiply a (halve-it b)))
        :else (+ a (fast-multiply a (dec b)))))

(fast-multiply 5 8) ; => 40

(every? #(= (apply multiply %) (apply fast-multiply %))
        (for [i (range 10) j (range 10)] [i j])) ; => true

No comments: