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

Ben*_*ach 2 caching haskell

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

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

我只是想知道是否有一些我在这里缺少的工具,或者是否有任何标准作为这样做的方法?我已经读过Haskell有点"自然缓存"(例如,如果我想将奇数定义为odds = filter odd [1..],我可以随时引用它,但是当我需要动态添加元素时,它似乎变得复杂了名单.

有关如何解决这个问题的任何建议?

谢谢.

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

Lil*_*ard 7

我相信你在寻找记忆.有很多方法可以做到这一点.一个相当简单的方法是使用MemoTrie包.或者,如果您知道输入域是有界数字集(例如[0,10000)),则可以创建一个数组,其中值是计算结果,然后您可以使用输入索引数组.虽然您的输入数字低于10,000,但随后的迭代可能会大大超过10,000,因此Array方法对您无效.

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

  • 原来我的整数反转函数没有做任何类型转换是非常低效的.我修复了这个问题,现在程序在我的机器上运行了一秒钟,没有任何记忆.不过,这是一个很好的工具.谢谢您的帮助! (3认同)