gpt4 book ai didi

recursion - Clojure中的尾递归

转载 作者:行者123 更新时间:2023-12-04 05:22:54 24 4
gpt4 key购买 nike

这是一个使用尾部递归的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代码有什么问题?

最佳答案

没什么,只需要使用BigInt即可:

(factorial 1N 30N) ;=> 265252859812191058636308480000000N

参数可能很小,但结果却不是!

请注意,也提供了滴答版本的算术运算符,它们支持任意精度:
(reduce *' (range 1 31)) ;=> 265252859812191058636308480000000N

关于recursion - Clojure中的尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16655548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com