我正在尝试计算Clojure中的第500个斐波那契数:
(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)
程序失败,因为数字太大:整数溢出。如何解决这个问题?
Clojure默认的整数类型是long
。如果你想指定一个整数字面值应该被认为是一个clojure.lang.BigInt
,只需在数字后面加上一个N
。
(defn fib-pair [[a b]] [b (+ a b)])
(nth (map first (iterate fib-pair [1N 1N])) 500)
;= 225591516161936330872512695036072072046011324913758190588638866418474627738686883405015987052796968498626N
您实际上可以只指定两个初始值中的一个作为BigInt
,因为:
(+ 1N 1)
;= 2N
(type (+ 1N 1))
;= clojure.lang.BigInt
可以使用clojure。Core/+'代替clojure。core/+ in fib-pair
这将在需要时自动提升long值。
(defn fib-pair [[a b]] [b (+' a b)])
你也可以使用类型提示。
(defn fib-pair ^BigInteger [[^BigInteger a ^BigInteger b]] [b (+' a b)])
(nth (map first (iterate fib-pair [1 1])) 500)
查看更多信息http://dev.clojure.org/display/doc/Documentation为+ 1.3 +数字+工作