【问题标题】:Issues with iteration in a recursive function递归函数中的迭代问题
【发布时间】:2016-09-26 22:50:05
【问题描述】:

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

例如,如果找到路径,“访问过”列表,在代码中,应该是我获得的完整路径(然后测试该路径是否足以成为“最短路径” ”)。但是,我尝试实现的任何打印语句都没有被打印,以查看我正在点击的节点。 (即试图找到从节点'A'到节点'C'的路径,节点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

【问题讨论】:

  • 我看到了mutable default,但你还是用path = [str(start)] 覆盖了
  • 为什么不使用修改版的 Dijkstra's 两笔费用?
  • 好的,感谢您通知我可变默认值。显然,代码正在通过图表“浏览”。出于某种原因,我仍然使用此代码得到“无”(无约束的解决方案)。如果约束是开放的,它确实给出了最短路径的解决方案,但如果约束很紧,那么它就会开始出现问题。所以,我可能会采纳你的建议 @Evil Tak 并修改 Dijkstra 的。

标签: python recursion iteration graph-theory


【解决方案1】:

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

我认为您可能想根据node 而不是visited[0] 检查您的具体姓名。

您的代码可能存在其他一些问题。例如,如果路径 a-&gt;b 存在,您将永远不会考虑路径 a-&gt;c-&gt;b(因为在选中 a-&gt;b 之后,b 将位于 visited 中)。在某些类型的图中(三角不等式不成立),第一条路径可能比第二条路径短。如果在您的图表中不可能做到这一点,您可能会没事,但这不是您应该为所有图表假设的。

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 2017-11-29
    • 2019-04-03
    • 2016-03-01
    • 2023-01-17
    • 2021-12-31
    • 2016-04-07
    • 2012-10-17
    • 2021-12-09
    相关资源
    最近更新 更多