这是一个使用尾递归的 lisp 代码。
(defun factorial (f n)
(if (= n 1)
f
(factorial (* f n) (- n 1))))
我将其翻译成 clojure 代码,期望相同的尾递归优化。
(defn fact [f n]
(if (= n 1)
f
(fact (* f n) (dec n))))
但是,即使数字很小,我也得到了这个整数溢出(不是堆栈溢出)(fact 1 30)
。
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1374)
我试过了recur
,但得到了同样的错误。
(defn factorial [f n]
(if (= n 1)
f
(recur (* f n) (dec n))))
clojure 代码有什么问题?