我试图从项目欧拉解决#15,这是我的第一个解决方案 进口Data.List模块哈斯克尔如何存档记忆
type Location = (Int,Int)
boardX = 20
boardY = 20
stepBack :: Location -> [Location]
stepBack (x,y) = [(x-1,y), (x,y-1)]
legalStep :: Location -> Bool
legalStep (x,y) = x >= 0 && y >= 0
iteractStep :: Int -> [[Location]]
iteractStep 0 = [[(boardX, boardY)]]
iteractStep n = [x:y|y <- iteractStep (n-1), x<- stepBack (head y), legalStep x]
main :: IO()
main = putStrLn $ show $ length $ iteractStep (boardX + boardY)
这是很慢的,我觉得有这么多子问题重新计算的,我试图记住子问题的答案,然后我发现这个例子:
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
我尝试在ghci中,我发现它实际上记住子问题的结果,我不明白这是如何代码可以记忆结果,它看起来像
map fib [0 ..]
是全局的,但我认为它是方法范围(只存在于每个方法调用),为什么它可以记忆结果?
[Haskell中的Memoization?](http://stackoverflow.com/questions/3208258/memoization-in-haskell) –