我是一名编程初学者,现在从 Python 切换到 Clojure。我正在研究素数代码,但我没有得到错误。我也想练习递归
(defn true-division [n i]
(= (/ n i) (quot n i)))
;proves if division is possible
(defn is-prime-number2 [n]
(def i (atom (- n 1)))
(while (> @i 1)
(do
(conj list (true-division n @i))
(swap! @i dec))))
;should fill an empty list with true and false statements
;in the final function I want to check if there is a true in the list
(println (is-prime-number2 12))
第二个代码作为递归尝试:
(defn true-division [n i]
(= (/ n i) (quot n i))
)
(println (true-division 4 5))
(defn is-prime-number [n]
(let [list []]
(loop [i (- n 1)]
(while(> i 0)
(do
(conj list (true-division n i))
(recur (dec i)))))))
(println (is-prime-number 12))
我的首选方法是留在循环/迭代中 - 如果出现 true
,则中断循环。
我不知道如何用迄今为止学到的基础知识来编写此代码。如果我正在创建循环,那么当达到条件时我总是很难打破它们。
在此示例中,我将创建一个带有 if
的最终函数,以证明列表中是否存在 true 并打印出结果。
我听说过 lazy
函数,但我想练习语法和函数,所以我非常感谢您按照我计划的方式提供帮助:)
最佳答案
您建议测试一个数字是否可以除以小于该数字的任何数字的算法可以使用循环或使用序列来实现。我相信我们需要特别注意这样一个事实:1通常不被认为是素数。基于循环的实现可能如下所示:
(defn true-division? [n i]
(zero? (rem n i)))
(defn is-prime-number-using-loop? [n]
(and (<= n 2)
(loop [i (dec n)]
(cond
(= i 1) true
(true-division? n i) false
:else (recur (dec i))))))
(filter is-prime-number-using-loop? (range 50))
;; => (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47)
这就是基于序列的实现的样子:
(defn is-prime-number-using-seq? [n]
(and (<= 2 n)
(not-any? (partial true-division? n) (range 2 n))))
(filter is-prime-number-using-seq? (range 50))
;; => (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47)
基于序列的实现可以说更简洁,而基于循环的实现可能会使用最近的 Clojure 实现在 JVM 上提供更好的性能,尽管我没有对此进行测量。
然后您可以进行一些优化。例如,仅测试数字的平方根的整除性就足够了。如果您想要测试某个范围内的许多数字,埃拉托斯特尼筛法可能是一个不错的方法。
关于clojure - 我的开始@Clojure - 自己的代码不起作用,不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63088130/