Clojure布尔值true或false

Jam*_*ton 1 clojure

所以我一直在教自己一些基本的Clojure,但我对下面的内容很不满意.

我设法将一些代码放在一起,测试输入的数字是否为素数.(虽然它没有完全奏效)

(defn is-prime [x]
(loop [n 2]
(cond
 (< n x) (if (not= 0 (mod x n))
           (recur (inc n))
           (println "false"))
 :else (println "true"))))

(is-prime 5)
Run Code Online (Sandbox Code Playgroud)

按预期返回true.但是我现在的目标是让它在屏幕上返回true或false而不是我的打印行.我需要布尔值为true或false而不添加我正在添加的文本.

Shl*_*omi 6

我不知道你为什么没能简单地改变(println "true")true.这很好用:

(defn is-prime [x]
(loop [n 2]
  (cond
   (< n x) (if (not= 0 (mod x n))
             (recur (inc n))
             false)
   :else true)))

  (is-prime 5) ;; true

  (filter is-prime (range 2 15)) ;; (2 3 5 7 11 13)
Run Code Online (Sandbox Code Playgroud)

另一方面,在clojure中,nil并且false是唯一两个'falsey'值,因此如果将ifsexp 更改为:此函数将起作用:

(when-not (zero? (mod x n))
  (recur (inc n)))
Run Code Online (Sandbox Code Playgroud)

这是另一种更为"同义"的方式:

(defn is-prime [x]
  (cond
    (<= x 1) false
    (= x 2) true
    :else (every? #(pos? (mod x %)) (range 2 (inc (Math/sqrt x))))))
Run Code Online (Sandbox Code Playgroud)

因此,如果您想要一个在n和之间生成所有素数的函数m,请执行以下操作:

(defn all-primes [n m]
  (filter is-prime (range n m)))

(all-primes 90 110) ;; (97 101 103 107 109)
Run Code Online (Sandbox Code Playgroud)