我正在做这个练习。 Pascal's Trapezoid
我的解决方案是:
(fn pascal[initseq]
(let [gen-nextseq (fn [s]
(let [s1 (conj (vec s) 0)
s2 (cons 0 s)]
(map + s1 s2)))]
(cons
initseq
(lazy-seq
(pascal
(gen-nextseq initseq))))))
我通过了前三个测试用例,但最后一个失败了。
它说“java.lang.ArithmeticException:integer overflow”
那么,Clojure中有一个大整数,还是有更好的方法来解决这个问题?
答案 0 :(得分:8)
将+更改为+'。如果结果不适合long,那将自动为你提供一个clojure.lang.BigInt。您还可以在文字上使用N后缀来获取BigInt。
(class (+' 3 2)) ;=> java.lang.Long
(class (+' 300000000000000000000000000000 2)) ;=> clojure.lang.BigInt
(class 3N) ;=> clojure.lang.BigInt
答案 1 :(得分:2)
您可以使用+'
代替+
来获得任意精确度。
(fn pascal[initseq]
(let [gen-nextseq (fn [s]
(let [s1 (conj (vec s) 0)
s2 (cons 0 s)]
(map + s1 s2)))]
^^
...
所以你可以修改上面标记的代码部分,如下所示。
(map +' s1 s2)))]