This is my Clojure solution to Chapter 1, Exercise 22:
(ns sicp.ch1.ex22
(:require [sicp.ch1.ex21 :as sicp-ch1-ex21]))
(defn prime?
[n]
(= n (sicp-ch1-ex21/smallest-divisor n)))
(defn report-prime
[n elapsed-time]
(println "* " n elapsed-time))
(defn runtime
[]
(System/nanoTime))
(defn start-prime-test
[n start-time]
(let [p (prime? n)]
(when p
(report-prime n (- (runtime) start-time)))
p))
(defn timed-prime-test
[n]
(start-prime-test n (runtime)))
(defn search-for-primes
[start cnt]
(reduce
(fn [acc x]
(if (= cnt (count acc))
(reduced acc)
(if (timed-prime-test x)
(conj acc x)
acc)))
[]
(filter #(= 1 (rem % 2))
(iterate inc start))))
(search-for-primes 1000 3) ; ~5,000ns
(search-for-primes 10000 3) ; ~15,000ns
(search-for-primes 100000 3) ; ~50,000ns
(search-for-primes 1000000 3) ; ~160,000ns
No comments:
Post a Comment