我认为形成这个问题的最好方法是用一个例子......所以,我决定询问这个问题的实际原因是因为Euler项目的问题55.在这个问题中,它要求找到低于10,000的Lychrel数.在命令式语言中,我会得到导致最终回文的数字列表,并将这些数字推送到我的函数之外的列表中.然后,我会检查每个传入的号码,看它是否是该列表的一部分,如果是,只需停止测试并得出结论,该号码不是Lychrel号码.我会用非lychrel数字及其前面的数字做同样的事情.
我之前已经做过这件事并且很好地完成了.然而,实际上在Haskell中实现这一点似乎是一个很大的麻烦,而不是在我的函数中添加一堆额外的参数来保存前驱,而绝对的父函数来保存我需要存储的所有数字.
我只是想知道是否有一些我在这里缺少的工具,或者是否有任何标准作为这样做的方法?我已经读过Haskell有点"自然缓存"(例如,如果我想将奇数定义为odds = filter odd [1..],我可以随时引用它,但是当我需要动态添加元素时,它似乎变得复杂了名单.
有关如何解决这个问题的任何建议?
谢谢.
PS:我不是要求回答Project Euler问题,我只想更好地了解Haskell!
我相信你在寻找记忆.有很多方法可以做到这一点.一个相当简单的方法是使用MemoTrie包.或者,如果您知道输入域是有界数字集(例如[0,10000)),则可以创建一个数组,其中值是计算结果,然后您可以使用输入索引数组.虽然您的输入数字低于10,000,但随后的迭代可能会大大超过10,000,因此Array方法对您无效.
也就是说,当我在Haskell中解决问题55时,我并没有打扰做任何记忆.事实证明,它足够快以在所有输入数字上运行(最多)50次迭代.事实上,现在运行它需要0.2秒才能在我的机器上完成.
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |