我几天前开始学习Clojure并编写了一个简单的函数来决定它的给定参数是否为素数。 这是我的代码:
(defn is-prime [n]
(nil?
(some #(= (mod n %) 0)
(range 2 (java.lang.Math/sqrt n)))))
我的问题是,当用'4'调用它时,该函数返回true。
(is-prime 4)=>真
我为调试目的编写了另一个函数,它列出了所有小于250的素数:
(defn primes [] (filter #(is-prime %) (range 1 250)))
我在维基百科页面上查找了素数列表,发现除了数字'4'外,其余的输出都是正确的。
(素数) => (1 2 3 4 5 7 9 11 13 17 19 23 25 29 31 37 41 43 47 49 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 121 127 131 137 139 149 151 157 163 167 169 173 179 181 191 193 197 199 211 223 227 229 233 239 241)
我一直在考虑它,也许这只是我初学者的错误,但我无法找到解决方案。我非常感谢你的帮助,谢谢你。
答案 0 :(得分:10)
(range m n)
不包括n。所以(range 2 (sqrt 4)
= (range 2 2)
= ()
;它不会尝试任何除数。请注意,您的“素数”列表中还包含9个:(range 2 (sqrt 9))
= (range 2 3)
= (2)
所以它永远不会尝试除以3.相同的问题为25,49,121,169;基本上对于素数的所有正方形。
最简单的修复方法是(range 2 (inc (sqrt n)))
。