【发布时间】:2021-04-04 10:04:15
【问题描述】:
协同递归是指展开一棵树,例如 Ed Kmett 的 recursion-schemes 中的 anamorphism@
通过重新组合树,我的意思是共享结构的图。例如,二项式 option pricing tree 或 Pascal's triangle。这两者都有一定的对称性,所以为了效率,我们希望避免重新计算树的一部分,而是重新使用已经计算过的分支。
n.b.这个问题不是关于计算上述示例中的值的巧妙方法;这是一个关于递归的一般问题。
例如,对于期权定价,可以这样生成树:
data Tree x = Leaf x | Branch x (Tree x) (Tree x)
ana \(x, depth) ->
if depth == maxDepth
then LeafF x
else BranchF x (p * x, depth + 1) ( (1.0 - p) * x, depth + 1) -- p < 1.0
所以“向上”分支中的值为p * x,而“向下”分支中的值为(1-p) * x。由于这种对称性,“up”后接“down”节点的值与“down”后接“up”分支的值相同。就像整个子树一样。
我认为有可能通过 State 以某种方式传递包含已计算节点的哈希图。
或者,如果我能以某种方式访问已经计算好的子树,我可以将它作为 Left 传递给 apomorphism。
是否有一些现有的态射允许这样做?或者我可以自己编码吗?
【问题讨论】:
-
在haskell中进行动态编程的典型方法是将所有(通常是无限多个)中间值存储在惰性数据结构中,利用运行时系统的状态来评估thunk,而不是显式地建模有状态。见memoization。我怀疑这可以适应递归组合器,它会很漂亮:-)
标签: haskell recursion binary-tree recursion-schemes