为什么不能定义这个递归函数呢?
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)))))
这很好用:
(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)))))