我试图实现一个返回伯努利数字的函数:
(defn binom [N K]
(if (or (= K 0) (= N K))
(int 1)
(int (+ (binom (- N 1) (- K 1))
(binom (- N 1) K)))))
(defn bernoulli [M]
(if (= M 0)
(int 1)
(for [K (range 0 (- M 1))]
(* (binom M K)
(bernoulli K)))))
(println (bernoulli 5))
(显然它尚未正确实施,但这与我的问题无关)
当我运行此程序时,我得到异常java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Number
。
但是,如果我用[{1}}替换递归调用(bernoulli K)
,代码运行正常。
这里发生了什么?为什么我的binom函数可以将K作为一个数字处理好,但我的bernoulli函数不能用?
以下是整个错误消息:
(bernoulli 0)
答案 0 :(得分:3)
bernoulli
中的第二个条件是对for
的调用,它返回一个lazy-seq,但是你试图对它调用算术运算,这只是无效的。也许您想要将结果与(apply + (for ...))
相加,后者使用for
返回的值作为+
的参数(我不知道我头顶的具体算法) ,也许你想要平均值或产品而不是总和......)。