clojure 中的这个阶乘函数有什么问题

What's wrong with this factorial function in clojure

我有这个功能:

(defn ! [x]
  (let [n x product 1]
    (if (zero? n)
        product
        (recur (- n 1) (* product n)))))

我收到错误:java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2 (NO_SOURCE_FILE:33)

但是来自其他 SO 问题的这个阶乘工作正常。为什么?

(defn fact [x]
    (loop [n x f 1]
        (if (= n 1)
            f
            (recur (dec n) (* f n)))))

你不能在 letrecur

当您在此处 recur 时,您实际上是在函数定义上重复出现,该函数定义有一个参数,因此 java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2 (NO_SOURCE_FILE:33)

在第二个例子中,他使用了 loop,当你想要 recur 一些其他参数时,你应该使用它,而不是函数。

在你的例子中 recur 循环到 ! 期望 1 参数但得到 2,

在第二个例子中 recur 循环到 loop 期望 2 个参数并得到 2 个参数