所以我一直在教自己一些基本的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而不添加我正在添加的文本。
答案 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中,nil
和false
是唯一两个'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))))))
因此,如果您想要一个在n
和m
之间生成所有素数的函数,请执行以下操作:
(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)
您经常可以使用and
和or
来摆脱明确的false
和true
。摆脱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
。