当我的脑袋疼的Cuz它粘在树上,我尽量说些什么我想为简单明了,我可以:
- 鉴于信息的树,列出所有子树匹配谓词(在这种情况下,info = 3)。
一个简单的方法就是列出树的所有节点,然后过滤谓词。
type 'info tree = Node of 'info * 'info tree list
let rec visit = function
| Node(info, []) as node -> [ node ]
| Node(info, children) as node -> node :: List.collect visit children
let filter predicate tree =
visit tree
|> List.filter (fun (Node(info,_)) -> predicate info)
这里的树过滤器对OP的样本数据运行:
let test2 =
Node(("One",
[Node("Two",
[Node("Three",[Node("Five",[]);Node("Three",[])]);
Node("Three",[])]);
Node("Three",[])]))
let res2 = filter (fun info -> info = "Three") test2
:
令我惊讶的是代码如何轻松地适用于任何“信息类型与相应的判定
let result = filter (fun info -> info = 3) test
一件事
或者,如果您想列出信息而不是子树,代码很简单:
let rec visit = function
| Node(info, []) -> [ info ]
| Node(info, children) -> info :: List.collect visit children
let filter predicate tree =
visit tree
|> List.filter predicate
支持相同的查询,但只返回“信息记录,而不是树形结构:
let result = filter (fun info -> info = 3) test
> val result : int list = [3; 3; 3; 3]
这些都不是尾递归。 – gradbot 2010-05-12 00:26:29
@gradbot:不,他们故意没有。我认为首先理解简单版本是个好主意(在这种情况下,尾递归版本需要延续)。而且,O(log n)高度通常可以在没有尾递归的情况下处理(假定树是合理的)。 – 2010-05-12 00:29:16
@gradbot:...但指出这一事实绝对有用。 – 2010-05-12 00:33:36