Есть задача с PE
Написал решение в лоб, для 1000 работающее, для 10^7 - нет.
main :: IO( )
main = print $ problem_92 1000
problem_92 :: Int -> Int
problem_92 n = n - (length $ filter ( ==1) $ map last_ [1..n])
next_ :: Int -> Int
next_ n | (n >= 10) = (next_ ( n `div` 10 )) + (n `mod` 10)^2
| otherwise = n^2
last_ :: Int -> Int
last_ n = until (\x -> x == 89 || x == 1) next_ n
Нагуглил своего рода оптимизацию http://blog.dreamshire.com/2011/07/19/project-euler-problem-92-solution/, суть которой сводится к вычислению определённого количества значений функции и последующему использованию этих величин.
Вопрос. Как мемоизировать первые 567 значений функции last?