【问题标题】:Returning value when condition met in recursion递归满足条件时返回值
【发布时间】:2014-02-06 13:05:53
【问题描述】:

我正在尝试在图表中查找游览。我已经编写了以下代码,这似乎可以正确打印旅行。我希望它在找到第一个游览后停止并将游览作为列表返回。但是,递归堆栈似乎完成了,我没有得到想要的结果。当我找到第一个游览(即满足我的条件)时,如何返回一个值并完全停止递归?谢谢。

def get_tour(start, graph, path):
    if path==[]:
        from_node=start
    else:
        from_node=path[-1][1]

    if graph==[]:
        if start in path[-1]:
            print "Tour Found"
            return path

    else:
        edges=[node for node in graph if from_node in node]
        for edge in edges:
            to_node=[i for i in edge if i<> from_node][0]
            p=list(path)
            p.append((from_node,to_node))            
            g=list(graph)
            g.remove(edge)
            get_tour(start, g,p)


g=[(1,2), (1,3), (2,3)]

get_tour(1, graph=g, path=[])

【问题讨论】:

  • 那么,如果get_tour(start, g,p) 不是None,您为什么不直接返回return,而不是继续滚动循环?
  • 我不完全理解为什么部分,但你的建议有效。如果我说 a=get_tour(start, g,p) if (a): return a.谢谢!我会根据自己的理解努力。
  • 不完全理解这个问题,但我想如果你找到一个旅游,你想break 在循环中。另外我认为您需要以某种方式返回最后一个 else 块的结果。

标签: python recursion conditional


【解决方案1】:

使用递归时,您需要将返回值向上传递到整个调用堆栈。通常这不是使用递归的最佳方式。

无需详细说明您的代码,这里有一个快速建议:

def get_tour(start, graph, path):
    ret_val = None
    # Some code..
    if graph==[]:
        # Some code..
    else:
        edges=[node for node in graph if from_node in node]
        for edge in edges:
            # Some more code..
            ret_val = get_tour(start, g,p)
            if ret_val:
                break
    return ret_val

【讨论】:

    【解决方案2】:

    代码在找到游览并返回路径后继续执行的原因是因为它将它返回到在迭代中通过边缘进行的调用。如果那里没有中断或返回条件,则迭代将继续(并遵循更多的递归调用)。

    这是您的代码的修改版本,一旦满足条件,就会返回原始调用(以及递归调用),我添加了一些调试信息以尝试使过程更清晰:

    #!/usr/bin/python
    
    # globals
    verbose = True
    
    def get_tour(start, graph, path):
        if path==[]:
            from_node=start
        else:
            from_node=path[-1][1]
    
        if verbose:
            print '\nfrom_node:\t', from_node
            print 'start:\t', start
            print 'graph:\t', graph
            print 'path:\t', path
    
        if graph==[]:
            if start in path[-1]:
                print "Tour Found"
                return path
    
        else:
            edges=[node for node in graph if from_node in node]
            for edge in edges:
                to_node=[i for i in edge if i <> from_node][0]
                p=list(path)
                p.append((from_node,to_node))            
                g=list(graph)
                g.remove(edge)
                path = get_tour(start, g, p)
                if path:
                    return path
    
    
    g=[(1,2), (1,3), (2,3)]
    
    get_tour(1, graph=g, path=[])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多