为什么不能定义这个rec​​ur函数?

时间:2021-04-15 06:15:31

标签: clojure

这很好用:

(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)))))

第二个有什么问题?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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