Clojure布尔值true或false

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clojure布尔值true或false相关的知识,希望对你有一定的参考价值。

所以我一直在教自己一些基本的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而不添加我正在添加的文本。

答案

我不知道为什么你不能简单地将(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更改为:

(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)
另一答案

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

为了看到clojure的力量,这里是懒惰的素数seq代的思维伸展运动:

user>
(def primes (cons 2 (filter (fn [n]
                              (let [sqn (Math/sqrt n)]
                                (not-any? #(zero? (rem n %))
                                          (take-while #(<= % sqn) primes))))
                            (iterate #(+ 2 %) 3))))
#'user/primes

user> (last (take 10000 primes))
104729

user> (take 20 primes)
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71)

user> (last (take 10000 primes))
104729

user> (last (take 100000 primes))
1299709
另一答案

你可以经常使用andor摆脱明确的falsetrue。像println一样摆脱了Shlomis,这给了我们......

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

对我来说,这更清楚了。


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

以上是关于Clojure布尔值true或false的主要内容,如果未能解决你的问题,请参考以下文章

如何对相同布尔值的块进行分组?

那个布尔值不就是true ,false吗,怎么还又0和1了??不解

JavaScript中布尔值为false的几种情况

将字符串“true”/“false”转换为布尔值[duplicate]

成功执行所有删除操作时返回布尔值 (true | false)

python-逻辑运算:not\and\or和布尔值:True\False