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)
此程序失败,因为数字太大:整数溢出.如何解决这个问题呢?
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)
您可以使用clojure.core/+",而不是clojure.core/+中fib-pair
这将在需要时自动推广多头.
(defn fib-pair [[a b]] [b (+' a b)])
Run Code Online (Sandbox Code Playgroud)