3

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

doseq如果我发现一个特定的数字将 n 除以余数 0,如何返回 false 并中断通话?

我怎么知道我一直走到列表的末尾?

我是否必须始终遍历列表中的所有元素?

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

我被困在一个点:

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

2 回答 2

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.

doseq 不应该像Java 中的 forwhile构造那样使用。

查看这些实现以了解如何在 Clojure 中实现 is-prime:Clojure Euler - 问题 007

于 2013-10-22T13:10:33.800 回答
2

doseq可能有一种方法可以通过使用异常来打破 a ,但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)))))
于 2013-10-22T13:28:50.603 回答