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中,nil
和false
是唯一的两个'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))))))
因此,如果您想要一个在n
和m
之间生成所有素数的函数,请执行以下操作:
(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
另一答案
你可以经常使用and
和or
摆脱明确的false
和true
。像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了??不解
将字符串“true”/“false”转换为布尔值[duplicate]