Tôi đang cố gắng bắt chước Sàng để tìm tất cả số nguyên tố ít hơn một số bằng cách sử dụng Haskell. Tôi đã tìm thấy chương trình Haskell khác sử dụng phương pháp Sieve với tốc độ tuyệt vời. Tuy nhiên chức năng đệ quy sau tôi đã viết là rất chậm. Mã như sauTại sao chức năng đệ quy này trong Haskell quá chậm?
sieve' :: Integer -> Integer -> [Integer]
sieve' n 1 = [2 .. n]
sieve' n (k + 1) | [x | x <- sieve' n k, x == k + 1] == [] = sieve' n k
|otherwise = [x | x <- sieve' n k, x == k + 1 || not (mod x (k + 1) == 0)]
sieve :: Integer -> [Integer]
sieve n = sieve' n n
Rây 20 mất khoảng 2 phút. Rây 30 vẫn chưa kết thúc trong khi tôi đang viết câu hỏi này.
Bất cứ ai có thể giải thích tại sao hàm đệ quy này quá chậm. Cảm ơn vì bất kì sự giúp đỡ nào của bạn.
Là cơ quan cuối cùng trên sàng của Eratosthenes trong Haskell, bạn nên xem bài viết của Melissa O'Neill (http://lambda-the-ultimate.org/node/3127) trong Tạp chí Lập trình Chức năng (2009). Nên có thêm một vài thủ thuật trong đó. – ShiDoiSi