5 clojure greatest-common-divisor
我已经编写了以下代码来计算两个正数的最大公约数.在代码中是否存在一些不是最优或足够的问题,如果是这样的话,那么做GCD的更多cloujerian方式是什么?
(def gcd (fn [a b] (->> (map (fn [x]
(filter #(zero? (mod x %)) (range 1 (inc x))))
[a b])
(map set)
(apply clojure.set/intersection)
(apply max))))
(gcd 1023 858)` => 33
Run Code Online (Sandbox Code Playgroud)
使用序列操作进行数值运算(没有换能器)有点重量级,这将是一个很好的例子recur:
user> (defn gcd [a b]
(if (zero? b)
a
(recur b (mod a b))))
#'user/gcd
user> (gcd 1023 858)
33
Run Code Online (Sandbox Code Playgroud)
这节省了构建序列然后被丢弃的一些努力/时间.在这种情况下,它创建两个数字序列的安全性,将其转换为两个集合的序列,然后将其粉碎成单个集合,其中最大值是答案.
此外,通常,在定义包含函数的变量时使用defn(定义函数的简称),它会自动添加很多好东西,有助于工具很多,比如显示参数类型等.
也许还应该提到“只使用 Java”方法:
(defn gcd [a b]
(.gcd (biginteger a) (biginteger b)))
Run Code Online (Sandbox Code Playgroud)