为什么不能定义这个递归函数呢?

Why can't this recur function be defined?

这很好用:

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

而这个甚至可以作为一个符号来评价:

(defn fact2 []
  (loop [prod [1 2 3]]
    (if (empty? prod)
      prod
      (recur (rest prod) (* prod 2)))))

第二个有什么问题?

这是计算第二个表达式时抛出的异常:

Execution error (IllegalArgumentException) at user/fact2 (test.clj:3).
Mismatched argument count to recur, expected: 1 args, got: 2

fact2 中的 loop 绑定只有一个变量(称为 prod),但是,recur 调用将传递 2 个值。您不能使用单个变量 prod 来保存产品(一个数字)和数字列表(一个集合)。

正确的定义应该是这样的:

(defn fact2 []
  (loop [n [1 2 3] prod 1]
    (if (empty? n)
      prod
      (recur (rest n) (* prod 2)))))