Recursion clojure中的尾部递归

Recursion clojure中的尾部递归,recursion,clojure,tail-recursion,Recursion,Clojure,Tail Recursion,这是一个使用尾部递归的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)))) 然而,我得到了这个整数溢出(不是堆栈溢出),即使是使用较小的数字,例如(事

这是一个使用尾部递归的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))))
然而,我得到了这个整数溢出(不是堆栈溢出),即使是使用较小的数字,例如
(事实1 30)

我尝试了
recur
,但得到了相同的错误

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

clojure代码有什么问题吗?

没什么,只需使用
BigInt
s:

(factorial 1N 30N) ;=> 265252859812191058636308480000000N
争论可能很小,但结果却并非如此

请注意,算术运算符的勾选版本也可用,它们支持任意精度:

(reduce *' (range 1 31)) ;=> 265252859812191058636308480000000N

另外值得注意的是,由于JVM的限制,Clojure不支持自动尾部调用优化
recur
在这种情况下确实是一种递归习惯用法。在clojure文档中哪里可以找到使用无循环recur的示例?你在这里使用它的方式。
(reduce *' (range 1 31)) ;=> 265252859812191058636308480000000N