【问题标题】:Clojure boolean true or falseClojure 布尔值 true 或 false
【发布时间】:2017-12-27 11:26:47
【问题描述】:

所以我一直在自学一些基本的 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。然而,我现在的目标是让它在屏幕上返回真或假,而不是用我的打印行。如果没有我添加的文本,我需要布尔值是真还是假。

【问题讨论】:

  • 嗨,不,那是我尝试的第一件事。第二部分你让我失望了。对不起。

标签: clojure


【解决方案1】:

我不知道您为什么没有设法简单地将 (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 是仅有的两个“假”值,因此如果您将 if sexp 更改为:

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

这里是另一种更“clojuristic”的方式来做同样的事情:

(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)

【讨论】:

  • 我在 REPL.it 中运行它,这是我被告知运行它的平台。
  • 使用你上面的工作,我在转换它时一定错过了括号或其他东西。非常感谢 Shlomi。
  • Shlomi,is-prime 前面的过滤器,是否可以允许根据输入决定范围?例如改变它(prime-filter 2 15)?
  • @JamesBurton,当然是。您可以从键盘读取一个数字,也可以将其作为参数传递给另一个函数
  • 我添加了以下内容以从 is-prime 函数中读取。但它读的是真、假等而不是数字。我如何获得两个范围之间的所有素数? (defn is-prime [x] (loop [n 2] (cond (
【解决方案2】:

只是为了好玩/与问题无关

要了解 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

【讨论】:

    【解决方案3】:

    您可以经常使用andor 来摆脱显式falsetrue。像Shlomi 那样摆脱了printlns,这给了我们......

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

    对我来说,这更清楚。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      相关资源
      最近更新 更多