在clojure中检查数字的素数的功能方法

3 functional-programming clojure

什么是更正确的函数方式来编写以下代码来检查数字是否为素数:

(defn prime? [n]
  (loop [k 2]
    (cond
     (< k n) (if (not= 0 (mod n k))
               (recur (inc k))
               (println n "is not prim"))
     :else (println n "is prim"))))
Run Code Online (Sandbox Code Playgroud)

Die*_*sch 8

无论您使用哪种算法来测试素数,"正确的功能方式"都将是您的prime?函数返回truefalse.就目前而言,您的函数返回nil并具有副作用(打印出来的东西).

然后,您可以(println (prime? x))检查特定的数字,并将副作用限制在该单个语句中.

  • @teymuri纯函数式编程中的"输出"通常是指返回值.虽然`print`总是返回`nil`,但它有一个副作用(即它可以显示除了计算事物和返回结果之外的其他东西)写入`*out*`. (2认同)

rig*_*old 6

使用标准库函数(例如every?和)的更简单方法range

(defn divisible? [a b]
  (zero? (mod a b)))

(defn prime? [n]
  (and (> n 1) (not-any? (partial divisible? n) (range 2 n))))
Run Code Online (Sandbox Code Playgroud)

并将I / O重构为单独的功能,以实现更大的重用性:

(defn format-primality [n]
  (str n " " (if (prime? n) "is prim" "is not prim")))

(def print-primality
  (comp println format-primality))
Run Code Online (Sandbox Code Playgroud)

例:

user=> (map (fn [n] [n (prime? n)]) (range 1 15))
([1 false] [2 true] [3 true] [4 false] [5 true] [6 false] [7 true]
 [8 false] [9 false] [10 false] [11 true] [12 false] [13 true] [14 false])
Run Code Online (Sandbox Code Playgroud)