LazySeq无法转换为数字

时间:2016-05-08 15:03:36

标签: clojure

我试图实现一个返回伯努利数字的函数:

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

1 个答案:

答案 0 :(得分:3)

bernoulli中的第二个条件是对for的调用,它返回一个lazy-seq,但是你试图对它调用算术运算,这只是无效的。也许您想要将结果与(apply + (for ...))相加,后者使用for返回的值作为+的参数(我不知道我头顶的具体算法) ,也许你想要平均值或产品而不是总和......)。