缓存已知“答案”的功能替代方案

时间:2012-06-04 19:12:35

标签: haskell caching

我认为形成这个问题的最好方法是举个例子......所以,我决定询问这个问题的实际原因是因为Problem 55 on Project Euler。在这个问题中,它要求找到低于10,000的Lychrel数。在命令式语言中,我会得到导致最终回文的数字列表,并将这些数字推送到我的函数之外的列表中。然后,我会检查每个传入的号码,看它是否是该列表的一部分,如果是,只需停止测试并得出结论,该号码不是Lychrel号码。我会用非lychrel数字及其前面的数字做同样的事情。

我之前已经做过这件事并且很好地完成了。但是,实际上在Haskell中实现这一点似乎是一个很大的麻烦,而不是在我的函数中添加一堆额外的参数来保存前辈,而且一个绝对的父函数来保存我需要存储的所有数字。

我只是想知道我在这里是否有某种工具,或者是否有任何标准可以做到这一点?我已经读过Haskell有点“自然缓存”(例如,如果我想将奇数定义为odds = filter odd [1..],我可以随时提到它,但是当我需要时它似乎变得复杂动态地将元素添加到列表中。

有关如何解决此问题的任何建议吗?

感谢。

PS:我不是要求回答Project Euler问题,我只是想更好地了解Haskell!

1 个答案:

答案 0 :(得分:7)

我相信你正在寻找memoizing。有很多方法可以做到这一点。一个相当简单的方法是使用MemoTrie包。或者,如果您知道输入域是有界数字集(例如[0,10000)),则可以创建一个数组,其中值是计算结果,然后您可以使用输入索引数组。 Array方法对你不起作用,因为即使你的输入数字低于10,000,后续迭代也可以大大超过10,000。

那就是说,当我在Haskell中解决问题55时,我并没有打扰做任何记忆。事实证明,它足够快以在所有输入数字上运行(最多)50次迭代。事实上,现在运行它需要0.2秒才能在我的机器上完成。