java如何生成素数_java – Clojure中的时间素数生成

也许它正在处理懒惰的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版本更快.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值