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

  • 相关阅读:
    本地blast用法
    linux挂载移动硬盘
    酶设计软件rosetta安装
    redhat 6.7 安装nvidia显卡驱动时出现的问题
    分子模拟软件Schrodinger Suites 2015安装
    Python_二维数组
    Python_递归
    Python_装饰器
    Python_生成器generator
    Python_迭代器
  • 原文地址:https://www.cnblogs.com/FsharpZack/p/2760459.html
Copyright © 2020-2023  润新知