我(几乎)完全理解树的Zipper数据结构。但是,在一些出版物中,我看到了一些提示,即也可以使用Zipper的想法为任意图形创建不可变的函数数据结构(也可能有周期)。
这样做的方法是什么?
只要我们有周期,就意味着可以通过多个路径到达任何节点。因此,如果我专注于一个节点,对它进行一些更改,并将焦点移开,我可能稍后通过不同的路径返回到同一节点,这意味着它将是节点的“旧”版本,在改变之前。
我想出的唯一解决方案是在上下文中包含任何节点的更改列表。每次在焦点更改为节点X之前,应检查X是否是更改列表的成员,如果是,则应将其视为焦点节点。
如果我们还跟踪从更改列表中复制N节点X的次数,我们可以从更改列表中删除X,只要N =边数,向内到X.
有没有更好的方法呢?