以下两个函数都从2到(sqrt n),如果n是非素数,则一旦检测到它们就会停止
(defn is-prime-for? [n]
(empty? (for [i (range 2 (math/sqrt (inc n)))
:when (= 0 (rem n i))]
i)))
(defn is-prime-loop? [n]
(loop [i 2]
(cond (> i (math/sqrt (inc n))) true
(zero? (rem n i)) false
:else (recur (inc i)))))
Run Code Online (Sandbox Code Playgroud)
那么为什么我们会看到它们之间的巨大性能差异呢?"循环"版本花费了近4倍的时间(在我的桌面上)
project-euler.prob010> (time (dorun (map is-prime-for? (range 200000))))
"Elapsed time: 3267.613099 msecs"
;; => nil
project-euler.prob010> (time (dorun (map is-prime-loop? (range 200000))))
"Elapsed time: 12961.190032 msecs"
;; => nil
Run Code Online (Sandbox Code Playgroud)