F# 实现图的深度遍历

下面是图中的深度遍历F# 版本,如果有问题还请各位看官不要吝啬指正:)。

Graph类在我之前的随笔中已经定义过了,这边直接使用了。

type GraphOperations(graph : Graph) =

    ///depth-first traversal 
    member this.DFSTraverse(action : unit -> unit, startNodeId : string, endNodeId : string) =  
        let visited : string array = Array.zeroCreate graph.Nodes.Length 
        let visitIndex = ref 0              
        let rec dfsTraverse(nodeId : string) =                        
            match nodeId with 
            | found when nodeId = endNodeId ->                                       
                    action()
            | _ ->           
                    visited.[!visitIndex] <- nodeId                   
                    visitIndex := !visitIndex + 1
                    let node = ref Unchecked.defaultof<Node>
                    try
                        node := graph.Nodes |> List.find(fun item -> item.ID = nodeId)                        
                    with
                        | _ -> printfn "There is no such node"
                    if ((!node).OutgoingEdges.Length = 0) then
                        ()
                    else                   
                        for i in [0..((!node).OutgoingEdges.Length - 1)] do
                            if ( visited |> Array.exists(fun x -> x = (!node).OutgoingEdges.[i].ToNode.ID)) then
                                ()
                            else
                                dfsTraverse((!node).OutgoingEdges.[i].ToNode.ID)                                          
        dfsTraverse(startNodeId)

代码中的action参数为用户自定义参数,只不过我将其参数类型和返回指固定了,这样不好,在实际情况中要做相应的改动。做个笔记:)

原文地址:https://www.cnblogs.com/FsharpZack/p/2760459.html