[英]Tail recursion in clojure
這是一個使用尾遞歸的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.