递归函数中的迭代问题

时间:2016-09-26 22:50:05

标签: python recursion iteration graph-theory

下面的代码用于根据给定的约束(maxTotalDist和maxDistOutdoors)找到最短路径。我有主要是工作,但我遇到的问题是,即使我能找到一条路径(在一些给定的问题上)。我无法确认我找到了它。

例如,如果找到了路径,那么"访问了#34;在代码中,list应该是我获得的完整路径(然后测试路径是否足够好,成为"最短路径")。但是,我试图实现的任何印刷语句,以查看我打击的节点都没有被打印。 (即试图找到从节点&A 39到节点的路径,节点A有孩子[' b',' c'如果我制作样本 if 语句(如果访问[0] ==' c'),则打印语句不会关闭。)

无论如何,我知道这可能写得很糟糕,但任何帮助都会有所帮助。感谢。

def bruteForceSearch1(digraph, start, end, maxTotalDist, maxDistOutdoors, visited = [])
    if not (digraph.hasNode(start) and digraph.hasNode(end)):
        raise ValueError('Start or End not in graph')
    path = [str(start)]
    if start == end:
        return path
    shortest = None

    #This is the iterator talked about in the question
    for node in digraph.childrenOf(start):

        if (str(node) not in visited):
            visited = visited + [str(node)]

            #Sample print statement
            if visited[0] == 'nodeName':
                print "Node is part of search"

            newPath = bruteForceSearch1(digraph, node, end, maxTotalDist, maxDistOutdoors, visited)
            if newPath == None:
                continue
            if shortest != None:
                totalShort, outdoorShort = digraph.getDistances(shortest)
            total, outdoor = digraph.getDistances(path + newPath)
            if (total <= maxTotalDist) and (outdoor <= maxDistOutdoors):
                if (shortest == None):
                    shortest = newPath
                else:
                    if (len(newPath) < len(shortest)):
                        shortest = newPath
                    elif (len(newPath) == len(shortest)) and (total <= totalShort) and (outdoor <= outdoorShort):
                        shortest = newPath
    if shortest != None:
        path = path + shortest
    else:
        path = None
    return path

1 个答案:

答案 0 :(得分:0)

所有递归调用都会看到与visited[0]相同的值。它始终是原始start值的第一个子项。由于您将所有其他值附加到列表的末尾,因此不会将该子项替换为visited中的第一个值。

我认为您可能希望针对node检查您的具体名称,而不是针对visited[0]

您的代码可能还有其他一些问题。例如,如果路径a->c->b存在,则永远不会考虑路径a->b(因为bvisited被检查后将在a->b中。在某些类型的图形中(三角形不等式不成立),第一条路径可能比第二条路径短。如果在你的图表中不可能,你可以没事,但这不是你应该为所有图表所假设的。