【问题标题】:Wrong number of args (0) passed to: PersistentVector on loop/recur function传递给的 args (0) 数量错误:PersistentVector on loop/recur function
【发布时间】:2016-10-24 23:44:06
【问题描述】:

尝试定义一个factors 函数,该函数将使用循环/递归返回一个数字的所有因子的向量。

;; `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

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

    让我在你的代码中移动空格,这样你就知道出了什么问题:

    (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. 将结果值作为函数调用,不传递任何参数。

    【讨论】:

    • 哇,好的。我必须更好地跟踪这些括号。删除多余的括号就可以了...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多