簡體   English   中英

F#在樹中搜索F#

[英]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.chooseList.tryFind ,我使用了Seq所以它將在tryFind早期停止。 另外,此版本在名稱上具有謂詞匹配。 如果始終要使用相等性,則可以將name添加為參數,並將p替換為namewhen 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM