Бросок за пару trace
очков
memRoute :: (Int,Int) -> Int
memRoute (x,y) = trace ("mem: " ++ show (x,y))
fromJust $
lookup (x,y) $
map (\t -> (t,route t))
[(x,y) | x <- [0..20], y <- [0..20]]
route (0,0) = 0
route (_,0) = 1
route (0,_) = 1
route (x,y) = trace ("route: " ++ show (x,y))
memRoute (x-1,y) + memRoute (x,y-1)
чтобы увидеть, что вы вообще не запомнили.
ghci> memRoute (2,2)
mem: (2,2)
route: (2,2)
mem: (1,2)
route: (1,2)
mem: (0,2)
mem: (1,1)
route: (1,1)
mem: (0,1)
mem: (1,0)
mem: (2,1)
route: (2,1)
mem: (1,1)
route: (1,1)
mem: (0,1)
mem: (1,0)
mem: (2,0)
6
Повторное использование подкомпьютеров динамическое программирование .
import Data.Array
routes :: (Int,Int) -> Int
routes = (rte !)
where rte = array ((1,1), (n,n))
[ ((x,y), route (x,y)) | x <- [1 .. n],
y <- [1 .. n] ]
route (1,1) = 0
route (_,1) = 1
route (1,_) = 1
route (x,y) = rte ! (x-1,y) + rte ! (x,y-1)
n = 20
Обратите внимание, что алгоритм неверен, но, по крайней мере, легко быстро получить плохой ответ!