(defn prime [x]
(if (#(<= % (Math/sqrt x)) (first (filter zero? (mod x (range 2 (inc x))))))
false
true))
你好!我想用clojure检查给定的数字是否为素数。首先,我想过滤x的所有除数,然后选择这些除数的第一个数。最后,与x的平方根相比,如果第一个除数小于或等于x,则给定的数不是素数。否则就是。但是,当我运行代码时,我遇到了这样的错误。如何找出将Lazyseq转换为数字的问题?如果有人能帮助我,我将不胜感激!
答案 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)
两条评论:
range
会返回您尝试将(mod x ...)
应用于的seq。我想你错过了map
.. true
和false
没有任何意义;)(提示,试着看看函数not
的行为方式)你应该再做一次尝试,并向我们介绍你的想法!
答案 2 :(得分:0)
解释你的食谱:
x
。x
的平方根,则x
不是素数。给定的代码存在以下问题:
if
表单是多余的。zero?
和。{
mod x
。而且,虽然修复后的算法可行,但它仍然很笨拙。
x
的第一个除数本身就是x
。没有必要
与平方根相关。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