在 Haskell 中记忆递归函数的最快方法是什么?
背景:最近我一直在解决 Haskell 中的 Project Euler 问题。许多需要对递归定义的组合或数论函数进行多次计算,例如斐波那契数。如果这些函数被记忆,性能会显着提高,也就是说,函数的结果会被缓存以备后用。
我已经看到了很多解决这个问题的方法。最优雅的似乎是这个。一种使用 Data.IntMap(或哈希表)和 State monad。这个答案中建议了一个基于树的解决方案,这样的解决方案似乎相当普遍。再举一个例子,请看这篇博文。我见过使用内置函数的其他解决方案。在第 2 节中有fix
一个与. 还有几个预建的解决方案。
我想知道对于 Project Euler 中使用的各种函数,哪种记忆方法在实践中最快。我的直觉说哈希表库是,因为哈希表似乎是命令式语言中首选的字典结构。纯功能树解决方案很酷,但我的谷歌搜索告诉我,它们在渐近性能方面比哈希表差。
编辑
一些评论说这个问题太宽泛而无法回答,经过反思,我同意。因此,让我给出两个要记忆的函数的具体示例:一个递归计算第 n 个斐波那契数的函数,以及一个递归计算加泰罗尼亚数的函数。我想为大 n 多次计算这些函数。
我知道这些有明确的公式,但让我们忽略这一点,因为这里的真正意义是使用它们来对记忆技术进行基准测试。