[英]F# searching in trees F#
在遞歸樹類型中查找“ item / object / type”,樹類型為UNSORTED,因此二進制搜索操作不會成功。
Type Tree = T of (Name*Children)
And Children = Tree list
//findTree :Tree*Name -> Tree
我的代碼(不起作用)
let rec findTree t n = List.find(fun (T(nameTree,childTree)) -> n=nameTree ) t
我已經嘗試過使用遞歸和auxFunctions,但是最終卻很混亂,沒有成功。
您的基本類型實質上是這樣(清除丟失的類型):
type Tree =
| Tree of (string * Tree list)
現在樹是未排序的,因此您最好的辦法是線性搜索,遞歸地遍歷子節點直到找到匹配項。 在以下情況下,搜索將進行深度優先:
[<CompilationRepresentationAttribute(CompilationRepresentationFlags.ModuleSuffix)>]
module Tree =
let find p tree =
let rec findInner t =
match t with
| Tree(n, _) when p(n) -> Some(t)
| Tree(_, children) -> children |> Seq.choose (findInner)
|> Seq.tryFind (fun _ -> true)
| Tree(_, []) -> None
findInner tree
如果需要,可以使用List.choose
和List.tryFind
,我使用了Seq
所以它將在tryFind
早期停止。 另外,此版本在名稱上具有謂詞匹配。 如果始終要使用相等性,則可以將name添加為參數,並將p
替換為name
, when p(n)
替換為when n = name
。
現在,進行一些測試:
let tree = Tree("A",
[Tree("B",
[Tree("C",[]);
Tree("D",
[Tree("E",[])])
]);
Tree("F",[])
])
tree |> Tree.find (fun n -> n = "B") |> printfn "%A"
tree |> Tree.find (fun n -> n = "D") |> printfn "%A"
tree |> Tree.find (fun n -> n = "E") |> printfn "%A"
tree |> Tree.find (fun n -> n = "TEST") |> printfn "%A"
tree |> Tree.find (fun n -> n = "F") |> printfn "%A"
分別打印:
Some (Tree ("B", [Tree ("C", []); Tree ("D", [Tree ("E", [])])]))
Some (Tree ("D", [Tree ("E", [])]))
Some (Tree ("E", []))
<null>
Some (Tree ("F", []))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.