我对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)
答案 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