在Clojure中,程序给出了一个错误java.lang.Long当我调用fact函数时无法强制转换为clojure.lang.IFn

时间:2017-04-13 21:59:52

标签: clojure

(defn factorial [n fact]
         (if <= n 1) 
          fact
  (factorial (- n 1) (* n fact)))


(defn fact [n]
  (factorial (n 1)))

2 个答案:

答案 0 :(得分:3)

看起来您正在尝试使用参数来编写因子来携带总数,但是您的括号不太正确。

head(table(cut(x, breaks = c(-Inf, seq(0, 1442, by = 53.25)))))
#   (-Inf,0]   (0,53.2] (53.2,106]  (106,160]  (160,213]  (213,266] 
#       1652          1          6          1         34          6 

因为n是列表中的第一项,所以它被称为函数。但作为一个数字,它不能以这种方式使用。

要调用阶乘函数(n为输入,1为初始总和),您可能意味着

(factorial (n 1))

您的阶乘功能还有其他问题。

(defn fact [n]
  (factorial n 1))

(if <= n 1) 是一个函数,因此在用作if

的参数时需要调用它
<=

对factorial的递归调用几乎就是你想要的解决方案,但是有一些不匹配的括号,这就是你的意思

(if (<= n 1)
  ...

然而,可以使用一些正确/惯用的clojure俚语,这是一个更好的方法来完成你的完整解决方案

(defn factorial [n fact]
   (if (<= n 1)
      fact
      (factorial (- n 1) (* n fact))))

虽然,如果你使用调用堆栈来携带总数,你可以做得更好

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

(defn fact [n]
   (factorial n 1))

您可以稍微重新调整一下以使用(defn factorial [n] (if (<= n 1) 1 (* n (factorial (dec n))))) ,这会给您带来稍微好一点的表现,但我认为这是一个学术练习,您可以查看其他答案(例如Alan Thompson's answer )。

答案 1 :(得分:0)

在这个问题中,您可以看到2个示例解决使用递归与循环/重复相关的阶乘问题:

How to use tail recursion correctly?