【发布时间】:2012-05-24 20:23:30
【问题描述】:
我想计算递归定义的函数值r(i,j),由
r i j | i<0 || j<0 = 0
| i==0 && j==0 = 1
| otherwise = (i-1) * r (i-2) j + r (i-1) (j-1)
显然,这些系数的NxN 表可以在O(N^2) 中计算。
不幸的是,直接的评估,就像
[[r i j | j <-[0..50]]| i <- [0..50]]
以极其无效的方式执行(指数复杂度)。显然,Haskell 为每个 r i j 构建了整个递归树,并忽略了先前计算的 r (i-1) (j-1) 等的值。
计算这样一个表的优雅而有效的方法是什么?
【问题讨论】:
-
...我不知道haskell,但似乎您想要动态编程。 (谷歌)
-
你想要memoization,见haskell.org/haskellwiki/Memoization
-
如果您只想要一个值,而不是整个表,您可能想要计算递归系列的生成函数。我不是这方面的专家,但我曾经在关于离散数学/组合学的讲座中听说过。也许 math.stackexchange.com 的小伙伴们能够在这方面为您提供帮助。我与这种数学相关的词是“本影演算”、“gosper 算法”和“Zeilberger 算法”。也许有帮助。
标签: algorithm haskell functional-programming complexity-theory recurrence