gpt4 book ai didi

clojure - 我的开始@Clojure - 自己的代码不起作用,不要

转载 作者:行者123 更新时间:2023-12-04 09:21:54 26 4
gpt4 key购买 nike

我是一名编程初学者,现在从 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 的最终函数。证明列表中是否存在真值并打印出结果。
我听说了 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 上提供更好的性能,尽管我没有测量它。
然后你可以做一些优化。例如,只测试数字的平方根的整除性就足够了。如果您要测试的范围内有很多数字,则 Eratosthenes 筛法可能是一个不错的方法。

关于clojure - 我的开始@Clojure - 自己的代码不起作用,不要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63088130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com