即使我使用bigint,Clojure中的StackOverFlow也是如此

Ase*_*sal 0 clojure biginteger

我使用下面的代码来查找阶乘.

(defn factorial [x]
  (if (< x 2)
    1N
    (*' (factorial (- x 1)) x)))
Run Code Online (Sandbox Code Playgroud)

我正在使用bigint操作*',-'但即使在此之后,当我使用5500及以上版本调用它时,我遇到了stackoverflow错误.

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

StackOverflowError   clojure.lang.Numbers$LongOps.add (Numbers.java:455)
user=> (factorial 5300)
Run Code Online (Sandbox Code Playgroud)

我已经看过其他问题,但他们说使用这些操作应该给我正确的答案.那我在这里错过了什么?

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

mty*_*aka 5

StackOverflowError发生是因为factorial自身递归调用.大量x扩展到太多嵌套factorial调用,导致堆栈溢出.

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

(defn factorial [n]
  (loop [cnt n acc 1N]
     (if (zero? cnt)
        acc
        (recur (dec cnt) (*' acc cnt)))))
Run Code Online (Sandbox Code Playgroud)