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)
无论您使用哪种算法来测试素数,"正确的功能方式"都将是您的prime?函数返回true或false.就目前而言,您的函数返回nil并具有副作用(打印出来的东西).
然后,您可以(println (prime? x))检查特定的数字,并将副作用限制在该单个语句中.
使用标准库函数(例如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)
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |