Clojure java.lang.Long无法强制转换为clojure.lang.IFn错误

时间:2016-02-29 16:27:52

标签: recursion clojure

我试图在clojure中编写简单的阶乘函数,但我收到了这个错误:

java.lang.Long cannot be cast to clojure.lang.IFn

我知道这个错误通常是由于一个额外的括号,但我不确定这种情况。

首先我在LISP中编写了函数,它可以正常工作。 代码:

(defun factorial (n)
    (if (= n 1) 
        1
        (* (factorial (1- n)) n )
    )
)
(factorial 5)

然后我在clojure中尝试了它,它不起作用。 Clojure代码:

(defn factorial [n]
    (if (= n 1) 
        1
        (* (factorial(n)) n)
    )
)

(defn -main
    [& args]
    (println(factorial 5))
)

2 个答案:

答案 0 :(得分:4)

你在对factorial的递归调用中有一组额外的parens,可能是因为你想减少n,它应该是

(defn factorial [n]
    (if (= n 1) 
        1
        (* (factorial (dec n)) n) ;; <== 
    )
)

答案 1 :(得分:-1)

正如MarkNFI所示,递减有自己的运算符inc

但要向您展示代码中的问题:

(defun factorial (n)
    (if (= n 1) 
        1
        (* (factorial (1- n)) n ) ;; (1- n) must be changed to (dec n) or (- n 1)
    )
)
(factorial 5)

(1- n)不是clojure中的运算符。您必须先放置操作员。因此,在您的情况下,它将是:(- n 1)