zoukankan      html  css  js  c++  java
  • 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参数为用户自定义参数,只不过我将其参数类型和返回指固定了,这样不好,在实际情况中要做相应的改动。做个笔记:)

  • 相关阅读:
    MySQL too many connections
    【MySQL】 清除等待连接
    wmic 获得系统硬件信息
    Linux 修改用户名
    初步了解虚拟化
    MySQL show 语句
    php去除bom
    jq闭包
    git
    地址收藏
  • 原文地址:https://www.cnblogs.com/FsharpZack/p/2760459.html
Copyright © 2011-2022 走看看