错误的args(0)传递给:循环/重复函数

时间:2016-10-24 23:44:07

标签: clojure

尝试定义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

我必须在这里遗漏一些明显的东西。任何建议都非常感谢!

1 个答案:

答案 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一样,括号不是分组构造!它们是一个函数调用机制,你不能只是为了好玩而抛出额外的东西。在这里,您所写的内容具有以下含义:

  
      
  1. 运行将计算向量的loop
  2.   
  3. 将结果值作为函数调用,不传递任何参数。
  4.