2012-10-10 25 views
9

Tôi muốn tính !1000 trong clojure, làm cách nào tôi có thể thực hiện việc này mà không nhận được ngoại lệ tràn số nguyên?Clojure - Tính toán với số lớn

Mã giai thừa của tôi là ngay bây giờ: (reduce * (range 1 1001)).

Trả lời

19

Bạn có thể sử dụng toán tử *' mà hỗ trợ chính xác tùy ý bằng cách tự động phát huy kết quả để bigint trong trường hợp nó sẽ tràn:

(reduce *' (range 1 1001)) 
+0

Cảm ơn! Đó là một chút dễ dàng hơn và sạch hơn. – Sawny

+0

Ưu điểm/khuyết điểm của việc làm theo cách này thay vì cách của Hamza là gì? – Sawny

+0

Nó có thể chấp nhận đầu vào tùy ý. @Hamza nên sử dụng 'bigint' – noahlz

6

Đặt N ở phần cuối của số mà làm cho nó một bigint,

(reduce * (range 1N 1001N)) 
2

ép buộc các thông số để clojure.lang.BigInt

(reduce * (range (bigint 1) (bigint 1001))) 

I.e. nếu bạn đang làm việc với thư viện của bên thứ ba không sử dụng *'

(defn factorial' [n] 
    (factorial (bigint n)))