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所以这是一个学习练习.
的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)
归档时间: |
|
查看次数: |
170 次 |
最近记录: |