使用clojure检查给定是否为素数

时间:2016-01-26 22:33:37

标签: clojure

(defn prime [x]
    (if (#(<= % (Math/sqrt x)) (first (filter zero? (mod x (range 2 (inc x))))))
       false
       true))
你好!我想用clojure检查给定的数字是否为素数。首先,我想过滤x的所有除数,然后选择这些除数的第一个数。最后,与x的平方根相比,如果第一个除数小于或等于x,则给定的数不是素数。否则就是。但是,当我运行代码时,我遇到了这样的错误。如何找出将Lazyseq转换为数字的问题?如果有人能帮助我,我将不胜感激!

4 个答案:

答案 0 :(得分:1)

我认为问题略有不同。我们不想尝试大于我们想要知道的数字的平方根的值是否为素数。原因在此SO中解释。 (基本上如果x = a * b,那么一个AND b都不能大于平方根)

因此我们正在构建的序列达到平方根

(defn root-1 [x]
    (inc (long (Math/sqrt x))))

(defn range-1 [x]
  (range 2 (root-1 x)))

最后,我们过滤了除数:

(defn filter-1 [x]
  (filter #(zero? (rem x %))
        (range-1 x)))

特别是,我们可以在第一个停止,过滤是懒惰的,这很好地与:

(defn is-prime [x]
  (nil? (first (filter-1 x))))

我们可以尝试:

(is-prime 10) ; false
(is-prime 11) ; true

答案 1 :(得分:0)

两条评论:

  1. range会返回您尝试将(mod x ...)应用于的seq。我想你错过了map ..
  2. 如果你想的话,从if返回truefalse没有任何意义;)(提示,试着看看函数not的行为方式)
  3. 你应该再做一次尝试,并向我们介绍你的想法!

答案 2 :(得分:0)

解释你的食谱:

  1. 过滤x
  2. 的所有除数
  3. 选择第一个。
  4. 如果它小于或等于x的平方根,则x 不是素数。
  5. 给定的代码存在以下问题:

    • 周围的if表单是多余的。
    • 过滤器功能错误。它应该包含zero?和。{ mod x
    • 无需构建和应用匿名函数。只是 直接应用测试。

    而且,虽然修复后的算法可行,但它仍然很笨拙。

    • 素数x的第一个除数本身就是x。没有必要 与平方根相关。
    • 范围应该是2到x的平方根。然后是nil 第一个除数的值表示素数。

答案 3 :(得分:0)

快速检查该号码是否为素数:

(ns example.core
  (:gen-class)
  (:require [clojure.core.reducers :as r]))


(defn prime-number?
  [n]
  (let [square-root (Math/sqrt n)
        mod-zero? (fn [res new-val]
                    (if (zero? (mod n new-val))
                      (reduced false)
                      true))]
    (r/reduce mod-zero? true (range 2 (inc square-root)))))

(prime-number? 2147483647)
;=> true