【发布时间】:2017-06-25 12:08:02
【问题描述】:
我正在尝试解决 Project Euler 中的 #15,这是我的第一个解决方案 导入数据列表
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 dynamic-programming