Tôi đang làm việc với Project Euler Problem 14. Đây là giải pháp của tôi.Tại sao biểu thức Haskell này lại quá chậm?
import Data.List
collatzLength :: Int->Int
collatzLength 1 = 1
collatzLength n | odd n = 1 + collatzLength (3 * n + 1)
| even n = 1 + collatzLength (n `quot` 2)
maxTuple :: (Int, Int)->(Int, Int)->Ordering
maxTuple (x1, x2) (y1, y2) | x1 > y1 = GT
| x1 < y1 = LT
| otherwise = EQ
Tôi đang chạy sau ra khỏi GHCi
maximumBy maxTuple [(collatzLength x, x) | x <- [1..1000000]]
Tôi biết rằng nếu Haskell đánh giá nghiêm ngặt, thời gian trên đây sẽ là một cái gì đó như O (n). Kể từ khi Haskell đánh giá lazily mặc dù, nó có vẻ như thế này nên được một số liên tục nhiều n. Điều này đã được chạy gần một giờ rồi. Có vẻ rất không hợp lý. Có ai có bất kỳ ý tưởng tại sao?
Tôi không thấy lý do tại sao sự lười biếng của Haskell nên thực hiện bất kỳ sự khác biệt với sự phức tạp của việc này thuật toán. – sepp2k
Chức năng của bạn 'collatzLength' không phải là đệ quy đuôi. Điều này làm chậm chức năng và gây ra phân bổ không cần thiết. Và 'maxTuple' của bạn giống như' so sánh fst'. – fuz
@sepp Tôi thực sự không biết cách thực thi Danh sách. Nếu họ đang sử dụng Bản đồ, nếu Haskell đánh giá đúng, có vẻ như nó sẽ phải vượt qua danh sách nhiều lần. –