Aquí hay un problema de programación simple de SPOJ: http://www.spoj.com/problems/PROBTRES/ .
Básicamente, se le pide que genere el mayor ciclo de Collatz para números entre i y j. (El ciclo de Collatz de un número $ n $ es el número de pasos para llegar eventualmente de $ n $ a 1.)
He estado buscando una forma de Haskell para resolver el problema con un rendimiento comparativo que el de Java o C ++ (para que se ajuste al límite de tiempo de ejecución permitido). Aunque una solución Java simple que memoriza la duración del ciclo de cualquier ciclo ya calculado funcionará, no he tenido éxito en aplicar la idea para obtener una solución Haskell.
He probado Data.Function.Memoize, así como la técnica de memorización de tiempo de registro elaborada en casa utilizando la idea de esta publicación: /programming/3208258/memoization-in-haskell . Desafortunadamente, la memorización en realidad hace que el cálculo del ciclo (n) sea aún más lento. Creo que la desaceleración proviene de la parte superior del camino Haskell. (Intenté ejecutar con el código binario compilado, en lugar de interpretar).
También sospecho que simplemente iterar números de i a j puede ser costoso ($ i, j \ le10 ^ 6 $). Así que incluso intenté calcular previamente todo para la consulta de rango, usando la idea de http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . Sin embargo, esto todavía da el error "Límite de tiempo excedido".
¿Puedes ayudar a informar un programa Haskell competitivo y ordenado para esto?