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
块的结果。