Đây là một vấn đề lập trình đơn giản từ SPOJ: http://www.spoj.com/probols/PROBTRES/ .
Về cơ bản, bạn được yêu cầu xuất chu kỳ Collatz lớn nhất cho các số giữa i và j. (Chu kỳ Collatz của một số $ n $ là số bước cuối cùng nhận được từ $ n $ đến 1.)
Tôi đã tìm kiếm một cách Haskell để giải quyết vấn đề với hiệu năng so sánh hơn so với Java hoặc C ++ (để phù hợp với giới hạn thời gian chạy được phép). Mặc dù một giải pháp Java đơn giản ghi nhớ độ dài chu kỳ của bất kỳ chu trình đã được tính toán nào sẽ hoạt động, tôi đã không thành công khi áp dụng ý tưởng để có được giải pháp Haskell.
Tôi đã thử Data.Feft.Memoize, cũng như kỹ thuật ghi nhớ thời gian đăng nhập tại nhà bằng cách sử dụng ý tưởng từ bài đăng này: /programming/3208258/memoization-in-haskell . Thật không may, ghi nhớ thực sự làm cho việc tính toán chu kỳ (n) thậm chí chậm hơn. Tôi tin rằng sự chậm lại đến từ phía trên của cách Haskell. (Tôi đã thử chạy với mã nhị phân được biên dịch, thay vì diễn giải.)
Tôi cũng nghi ngờ rằng việc lặp lại các số từ i đến j có thể tốn kém ($ i, j \ le10 ^ 6 $). Vì vậy, tôi thậm chí đã thử tính toán trước mọi thứ cho truy vấn phạm vi, sử dụng ý tưởng từ http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . Tuy nhiên, điều này vẫn gây ra lỗi "Vượt quá giới hạn thời gian".
Bạn có thể giúp thông báo một chương trình Haskell cạnh tranh gọn gàng cho việc này không?