簡體   English   中英

在clojure中的尾遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM