Clojure布尔值true或false

时间:2017-12-27 11:26:47

标签: 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)

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

3 个答案:

答案 0 :(得分: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)

另一方面,在clojure中,nilfalse是唯一两个'falsey'值,因此如果您将if sexp更改为:<},则此函数的工作方式相同/ p>

(when-not (zero? (mod x n))
  (recur (inc n)))

这是另一种稍微更“反思”的方式:

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

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

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

(all-primes 90 110) ;; (97 101 103 107 109)

答案 1 :(得分:0)

只是为了与问题有趣/无关

看到clojure的力量,这里是懒惰的素数seq一代的心灵伸展运动:

void clrscr()
{
    system("@cls||clear");
}

答案 2 :(得分:0)

您经常可以使用andor来摆脱明确的falsetrue。摆脱println作为Shlomi,这给了我们......

(defn is-prime [x]
  (loop [n 2]
    (or (>= n x)
        (and (not= 0 (mod x n))
             (recur (inc n))))))

对我来说,这更清楚了。

顺便说一下,Clojure谓词按惯例?结束:is-prime?而不是is-prime