【发布时间】:2019-11-29 09:56:25
【问题描述】:
我已经解决了 Haskell 中的一个动态规划问题(实际上是一个 Project Euler 问题),归结为斐波那契数列的概括:
f(n) = f(n-1) + f(n-2)
g(n) = g(n-1) + g(n-3)
h(n) = h(n-1) + h(n-4)
还有一些这样的函数,由于问题的规模,我不得不添加记忆,这很简单,就像这样:
memF = (map f' [0 ..] !!)
where f' x | x <=1 = 1
f' 2 = 2
f' x = memF(x-1) + memF(x-2)
memG = (map f' [0 ..] !!)
where f' x | x <=2 = 1
f' 3 = 2
f' x = memG(x-1) + memG(x-3)
这很好用,所以我可以得到(memF 100) + (memG 100) + ... 的答案,我已经回答了这个问题,但是重复的代码很难看,我宁愿定义一个函数来生成记忆函数,比如:
mem d = (map f' [0 ..] !!)
where f' x | x < d = 1
f' x | x == d = 2
f' x = (mem d) (x-1) + (mem d)(x-d)
然后回答为mem 2 100 + mem 3 100 + ... 这失败了,或者至少缓存不起作用,我猜是因为每次调用都会重新创建数组,我想我可以使用 StateMonad 或 memoization 库,但我会有兴趣知道是否有办法在没有 Monads 的情况下做到这一点。请问有吗?
【问题讨论】:
标签: haskell recursion memoization