尝试定义factors
函数,该函数将使用loop / recur返回数字的所有因子的向量。
;; `prime?` borrowed from https://swizec.com/blog/comparing-clojure-and-node-js-for-speed/swizec/1593
(defn prime? [n]
(if (even? n) false
(let [root (num (int (Math/sqrt n)))]
(loop [i 3] (if (> i root) true
(if (zero? (mod n i)) false
(recur (+ i 2))))))))
(defn factors [x] (
(loop [n x i 2 acc []]
(if (prime? n) (conj acc n)
(if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i))
(recur n (inc i) acc))))))
但我一直遇到以下错误:
ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity
我必须在这里遗漏一些明显的东西。任何建议都非常感谢!
答案 0 :(得分:8)
让我在你的代码中移动空格,这样你就会明白错误:
(defn factors [x]
((loop [n x i 2 acc []]
(if (prime? n) (conj acc n)
(if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i))
(recur n (inc i) acc))))))
你在功能开始时看到奇怪的((
?那是什么意思?请记住,在Clojure中,与通常的lisps一样,括号不是分组构造!它们是一个函数调用机制,你不能只是为了好玩而抛出额外的东西。在这里,您所写的内容具有以下含义:
- 运行将计算向量的
loop
。- 将结果值作为函数调用,不传递任何参数。
醇>