在递归条件满足时返回值

时间:2014-02-06 13:05:54

标签: python recursion conditional

我正在尝试在图表中查找游览。我写了以下代码,这似乎是正确的打印之旅。我希望它一旦找到第一个巡回赛就停止并以列表的形式返回巡视路线。但是,递归堆栈似乎已完成,我没有得到所需的结果。当我找到第一个巡视路线,即满足我的条件时,如何返回值并完全停止递归?感谢。

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=[])

2 个答案:

答案 0 :(得分:0)

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

如果不详细了解您的代码,请参阅以下快速建议:

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

答案 1 :(得分:0)

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

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

#!/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=[])