我想计算递归定义的函数值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)
等。
计算这样一个表的优雅有效的方法是什么?