Вот простая проблема программирования от SPOJ: http://www.spoj.com/problems/PROBTRES/ .
По сути, вас просят вывести самый большой цикл Коллатца для чисел от i до j. (Цикл Коллатца с числом $ n $ - это число шагов, которые в итоге получатся от $ n $ до 1.)
Я искал способ Haskell для решения проблемы со сравнительной производительностью по сравнению с Java или C ++ (чтобы соответствовать допустимому пределу времени выполнения). Хотя простое Java-решение, которое запоминает продолжительность циклов любых уже вычисленных циклов, будет работать, мне не удалось применить идею для получения решения на Haskell.
Я попробовал Data.Function.Memoize, а также самодельную технику запоминания времени регистрации, используя идею из этого поста: /programming/3208258/memoization-in-haskell . К сожалению, на самом деле запоминание делает вычисление цикла (n) еще медленнее. Я полагаю, что замедление происходит из-за накладных расходов пути Хаскелла. (Я попытался запустить скомпилированный двоичный код вместо интерпретации.)
Я также подозреваю, что простая итерация чисел от i до j может быть дорогой ($ i, j \ le10 ^ 6 $). Поэтому я даже попытался предварительно вычислить все для запроса диапазона, используя идею из http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . Тем не менее, это все еще дает ошибку «Превышение лимита времени».
Можете ли вы помочь информировать об этом аккуратную конкурентоспособную программу на Haskell?