如何突破剂量?

时间:2013-10-22 12:55:58

标签: clojure

我对Clojure比较陌生。我试图通过编写一个简单的方法doseq来使用isPrime,该方法将返回true或false。

如果我发现一个特定的数字要将n除以余数0,我该如何返回false并突破doseq调用?

我怎么知道我一路走到列表的最后?

我是否必须经常浏览列表中的所有元素?

我是否应该使用原子作为标志来跟踪我是否找到了一个除以n的数字?

我陷入了困境:

(defn isPrime
  #_=>  "Is the given number prime"
  #_=>  [n]
  #_=>  (doseq [i 2 (int (inc (Math/sqrt n)))]
  #_=>    (if (= (mod n i) 0)

2 个答案:

答案 0 :(得分:3)

可能有一种方法可以通过使用异常来突破doseq,但在这种情况下你真的不应该使用doseq。它不是为这些问题而设计的。

另一方面,标准库函数not-any?完全符合您的需要。在类似的情况下,您还应该考虑not-any?的兄弟姐妹,some?every?not-every?

这是一个正确实现代码中(非常天真)算法的示例解决方案:

(defn prime?
  "Returns true if n is a prime number."
  [n]
  (not-any? #(zero? (mod n %))
            (range 2 (inc (Math/sqrt n)))))

答案 1 :(得分:2)

doseq不应该用于此目的。您需要将编码风格从命令式转变为功能性。

(doc doseq)
Repeatedly executes body (presumably for side-effects) with
bindings and filtering as provided by "for". Does not retain
the head of the sequence. Returns nil.

在Java中,

看看这些实现,了解如何在Clojure中实现is-prime:Clojure Euler - Problem 007