我的开始@Clojure-自己的代码不起作用,不是吗
我是一名编程初学者,现在正在从Python切换到Clojure。我正在研究素数代码,但我没有弄错。我也想练习递归我的开始@Clojure-自己的代码不起作用,不是吗,clojure,Clojure,我是一名编程初学者,现在正在从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-divi
(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)
(定义真正的划分?[ni]
(零?(rem n i)))
(defn是使用循环的素数?[n]
(及)(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47)
这就是基于序列的实现的样子:
(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)
(defn是使用seq的素数?[n]
(及)(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47)
基于序列的实现可以说更简洁,而基于循环的实现可能会在JVM上使用最近的Clojure实现提供更好的性能,尽管我没有对此进行衡量
然后你可以做一些优化。例如,只测试整数的平方根就足够了。如果在你想要测试的范围内有很多数字,筛选埃拉托斯烯可能是一个不错的方法
;; source http://www.sicpdistilled.com/section/1.2.6/
;; sicpdistilled is SICP in Clojure
(defn smallest-divisor [n]
(find-divisor n 2))
(defn find-divisor [n test-divisor]
(cond (> (square test-divisor) n) n
(divides/ test-divisor n) test-divisor
:else (find-divisor n (+ test-divisor 1))))
(defn divides? [a b]
(= (remainder b a) 0))
(defn prime? [n]
(= n (smallest-divisor n)))
我强烈建议您阅读Clojure中的SICP的简短形式。conj是一个函数,它接受一个数据结构并返回一个新的数据结构,但不会像您从其他语言中所期望的那样改变给定给它的数据结构。这对Clojure core中的大多数数据结构和函数都是正确的。变量不会改变,函数会改变t返回它们的新版本。此外,您可能想执行(循环[i(范围(-n 1)])。但是,这种命令式方法通常不是解决clojure中问题的方法。当您刚接触clojure并习惯于其他命令式语言时,要想找到上面这样的简单函数可能会很有挑战性。