如何在Clojure中使用biginteger?

Nic*_*ick 4 clojure integer-overflow fibonacci

我想在Clojure中计算第500个Fibonacci数:

(defn fib-pair [[a b]] [b (+ a b)])
(nth (map first (iterate fib-pair [1 1])) 500)
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)
Run Code Online (Sandbox Code Playgroud)

此程序失败,因为数字太大:整数溢出.如何解决这个问题呢?

jua*_*rro 6

Clojure中的默认整数类型是long.如果要指定应该考虑整数文字,clojure.lang.BigInt只需N在数字后面添加一个.

(defn fib-pair [[a b]] [b (+ a b)])
(nth (map first (iterate fib-pair [1N 1N])) 500)
;= 225591516161936330872512695036072072046011324913758190588638866418474627738686883405015987052796968498626N
Run Code Online (Sandbox Code Playgroud)

实际上,您只需将两个初始值中的一个指定为以下内容即可BigInt:

(+ 1N 1)
;= 2N
(type (+ 1N 1))
;= clojure.lang.BigInt
Run Code Online (Sandbox Code Playgroud)


Kyl*_*yle 5

您可以使用clojure.core/+",而不是clojure.core/+fib-pair

这将在需要时自动推广多头.

(defn fib-pair [[a b]] [b (+' a b)])
Run Code Online (Sandbox Code Playgroud)