Python 在递归中满足条件时返回值

Python 在递归中满足条件时返回值,python,recursion,conditional,Python,Recursion,Conditional,我试图在图表中找到旅游线路。我已经写了以下代码,这似乎是正确的打印旅游。我希望它在找到第一个巡演后停止,并将巡演作为列表返回。然而,递归堆栈似乎完成了,我没有得到期望的结果。当我发现第一次巡更(即我的条件满足)时,如何返回一个值并完全停止递归?谢谢 def get_tour(start, graph, path): if path==[]: from_node=start else: from_node=path[-1][1] if gr

我试图在图表中找到旅游线路。我已经写了以下代码,这似乎是正确的打印旅游。我希望它在找到第一个巡演后停止,并将巡演作为列表返回。然而,递归堆栈似乎完成了,我没有得到期望的结果。当我发现第一次巡更(即我的条件满足)时,如何返回一个值并完全停止递归?谢谢

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=[])
def get_tour(开始、图形、路径):
如果路径==[]:
from_node=start
其他:
from_node=路径[-1][1]
如果图形=[]:
如果从路径[-1]开始:
打印“已找到巡更”
返回路径
其他:
边=[图中节点的节点,如果来自节点中的_节点]
对于边中的边:
to_node=[i如果来自_node,则表示边缘中的i][0]
p=列表(路径)
p、 追加((从_节点,到_节点))
g=列表(图形)
g、 移除(边缘)
get_tour(开始、g、p)
g=[(1,2)、(1,3)、(2,3)]
get_tour(1,graph=g,path=[]))

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

在不详细介绍代码的情况下,这里有一个快速建议:

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

代码在找到巡更并返回路径后继续执行的原因是,它将巡更返回给在迭代过程中通过边进行的调用。如果不存在中断或返回条件,则迭代将继续(并将执行更多递归调用)

下面是代码的修订版本,在满足条件后立即返回原始调用(以及递归调用),我添加了一些调试信息,以使过程更清晰:

#!/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=[])
#/usr/bin/python
#全球的
详细=正确
def get_教程(开始、图形、路径):
如果路径==[]:
from_node=start
其他:
from_node=路径[-1][1]
如果冗长:
打印“\n来自\u节点:\t”,来自\u节点
打印“开始:\t”,开始
打印“图形:\t”,图形
打印“路径:\t”,路径
如果图形=[]:
如果从路径[-1]开始:
打印“已找到巡更”
返回路径
其他:
边=[图中节点的节点,如果来自节点中的_节点]
对于边中的边:
to_node=[i如果来自_node,则表示边缘中的i][0]
p=列表(路径)
p、 追加((从_节点,到_节点))
g=列表(图形)
g、 移除(边缘)
路径=获取路径(开始、g、p)
如果路径:
返回路径
g=[(1,2)、(1,3)、(2,3)]
get_tour(1,graph=g,path=[]))

那么你为什么不
返回
无论什么
get\u tour(start,g,p)
如果不是
None
返回,而不是继续循环呢?我不完全理解为什么部分,但你的建议有效。如果我说a=get_tour(start,g,p)如果(a):返回a。谢谢我会努力提高我的理解力。我不完全理解这个问题,但如果你找到一个旅游团,我想你想打破这个循环。另外,我认为您需要以某种方式返回上一个
else
块的结果。