即使我使用 bigint,Clojure 中的 StackOverFlow

StackOverFlow in Clojure even when I am using bigint

我正在使用以下代码求阶乘。

(defn factorial [x]
  (if (< x 2)
    1N
    (*' (factorial (- x 1)) x)))

我正在使用 bigint 操作 *'-' 但即使在那之后,当我使用 5500 及更高版本调用它时,我仍然遇到 Whosebug 错误。

WhosebugError   clojure.lang.Numbers$LongOps.combine (Numbers.java:419)
user=> (factorial 5300)

WhosebugError   clojure.lang.Numbers$LongOps.add (Numbers.java:455)
user=> (factorial 5300)

我看过其他问题,但他们说使用这些操作应该能给我正确答案。那么我在这里缺少什么?

我正在学习 Clojure,所以这是一个学习练习。

WhosebugError 的出现是因为 factorial 递归调用自身。大量 x 扩展为过多的嵌套 factorial 调用,导致堆栈溢出。

您应该重写您的函数以使用 loop/recur 而不是递归调用:

(defn factorial [n]
  (loop [cnt n acc 1N]
     (if (zero? cnt)
        acc
        (recur (dec cnt) (*' acc cnt)))))