【发布时间】:2016-06-24 05:20:26
【问题描述】:
我有一棵树表示为
type LazyTree<'T> =
| LazyBranch of 'T * ('T LazyTree list Lazy)
我想为每个节点分配一个编号n,从左到右计数。
更正式的
已编辑:
对于节点a,如果a 没有子节点,则h(a)=0
对于具有父节点p、h(a)=h(p+1) 的节点a
对于没有父节点的节点a,L(a) 是一个空集。
对于具有父节点的节点 a,L(a) 是所有节点的集合,其中对于每个节点 i,从根到它的路径不包含 a
对于节点a,S(a) 是L(a) 的所有元素,其中对于每个元素i 持有h(i)<=h(a)
我需要将每个节点a 的值替换为S(a) 的大小
我无法为我的问题想出一个不涉及副作用的解决方案。
我的函数应该返回一棵树。
它的节点依赖于左兄弟节点。所以,函数应该得到一个'T LazyTree Option作为参数。
但是它最左边的孩子依赖于依赖于我们的最右边的兄弟姐妹。看来,我们有一个无限循环。
我不是在问如何在有限树上解决它。
我不是在问一个抽象的概念。 以下是我如何从另一棵树返回一棵无限树:
type LazyTree<'T> =
| LazyBranch of 'T * ('T LazyTree list Lazy)
with
member this.Item = match this with LazyBranch(item,_) -> item
member this.Children = match this with LazyBranch(_,children) -> children
member this.Map func =
let children =
lazy
(
this.Children.Force()
|> List.map (fun child -> child.Map func)
)
LazyBranch(func this.Item, children)
【问题讨论】:
-
您提出了哪些解决方案,有哪些副作用?
-
我想出了一个有限树的解决方案。我只是将它作为一个列表遍历,然后从该列表中恢复树结构。不会在那里工作。我没有尝试用副作用解决它。
-
如果您投票结束,请在 cmets 中告知,如果您能解决它,至少不要提出解决方案。
-
我想我可以解决它,但不能用递归。我在写想法,因为目前还不清楚你到底想达到什么目的。从一个角度来看,您以分层方式将数字分配给节点,从另一个角度来看,您告诉该函数应该返回一棵树,而无需解释您期望什么树。
-
感谢您注意到我的“正式”描述中的错误。我纠正了它。我仍然认为,这个问题确实属于这个网站。
标签: algorithm recursion tree f# purely-functional