4

我正在尝试在 python 中构建一个图形库(以及标准图形算法)。我试图实现 DFS,这就是它的样子

def DFS(gr, s, path):
    """ Depth first search 
    Returns a list of nodes "findable" from s """
    if s in path: return False
    path.append(s)
    for each in gr.neighbors(s):
        if each not in path:
            DFS(gr, each, path)

这工作正常,但我对它的使用方式不满意。例如,目前您需要这样做

 path = []
 DFS(mygraph, "s", path)
 print path

而不是这个,我想以这种方式使用 DFS

path = DFS(mygraph, "s")
print path

使用递归 DFS,我无法想出像上面那样工作的实现。有人可以给我一些关于如何实现这一目标的指示吗?

4

3 回答 3

4

只需创建一个调用您已有的包装器方法:

def DFS(gr, s):
    path = []
    DFS2(gr, s, path)
    return path

DFS2是您在上面显示的方法。

于 2012-12-04T09:53:02.613 回答
3

其实你为什么不直接设置path一个空列表的默认值呢?因此,使用相同的代码但参数略有不同:

# Original
def DFS(gr, s, path):

# Modified
def DFS(gr, s, path=[]):

# From here you can do
DFS(gr, s)
于 2014-03-04T19:06:29.167 回答
2

您可以按照 chutsu 的建议对访问的节点使用空的默认值,但要小心使用可变的默认参数。此外,我建议使用集合而不是列表进行持续查找。

def DFS(gr, s, visited=None):
    """ Depth first search 
    Returns a list of nodes "findable" from s """
    if visited == None:
        visited = set([s])

    for each in gr.neighbors(s):
        if each not in visited:
            visited.add(each)
            DFS(gr, each, visited)

    return visited
于 2018-10-01T07:41:43.803 回答