也许它正在处理懒惰的seqs作为上面提到的答案.这是我的证据……
;; original prime? function
(defn prime? [n]
(or (= n 2)
(not (some #(zero? (rem n %))
(conj (range 3
(inc (Math/sqrt n))
2)
2)))))
;; prime? function using recur
(defn prime?-recur [num]
(cond (< num 2) false
(= num 2) true
(zero? (mod num 2)) false
:else (loop [n num
i 3]
(cond (>= i (inc (Math/sqrt n))) true
(zero? (mod n i)) false
(< i (inc (Math/sqrt n))) (recur n (+ i 2))))))
;; original printPrimes with option for testing both prime? funs
;; note I changed this to start on 2 since 1 is not prime
(defn printPrimes [n fn] (take n (filter fn (iterate inc 2))))
;; printPrimes using recursion
(defn printPrimes-recur [num fn]
(loop [n num i 2 primes []]
(cond (and (fn i) (< (count primes) n)) (recur n (+ i 1) (conj primes i))
(< (count primes) n) (recur n (+ i 1) primes)
:else primes)))
现在,让我们运行这些.首先只是为了确保新代码与原始代码匹配:
foo> (= (printPrimes 10000 prime?)
(printPrimes 10000 prime?-recur)
(printPrimes-recur 10000 prime?)
(printPrimes-recur 10000 prime?-recur))
true
现在有一段时间了! (使用您的ExecTime功能)
foo> (println (ExecTime printPrimes 10000 prime?)
(ExecTime printPrimes 10000 prime?-recur)
(ExecTime printPrimes-recur 10000 prime?)
(ExecTime printPrimes-recur 10000 prime?-recur))
575.977 166.691 548.363 141.356
nil
所以我们看到改变素数?使用递归的函数会产生很大的差异(大约快4倍),并且更改printPrimes函数以使用递归也会产生差异,但它只是一个微小的差异.我不确定java版本在我的计算机上占用多长时间,但你至少可以从上面的时间看到循环/复现版本似乎比使用seqs的原始clojure版本更快.