2

我正在做这个练习。帕斯卡梯形

我的解决方案是:

(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:整数溢出”

那么,Clojure 中是否有一个大整数,或者有没有更好的方法来解决这个问题?

4

2 回答 2

8

将 + 更改为 +'。如果结果不适合 long,那将自动为您提供 clojure.lang.BigInt。您还可以在文字上使用 N 后缀来获得 BigInt。

(class (+' 3 2)) ;=> java.lang.Long
(class (+' 300000000000000000000000000000 2)) ;=> clojure.lang.BigInt
(class 3N) ;=> clojure.lang.BigInt
于 2013-03-09T13:58:39.727 回答
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)))]
于 2013-03-09T13:58:51.280 回答