所以我一直在教自己一些基本的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而不添加我正在添加的文本.
我不知道你为什么没能简单地改变(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)
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |