我正试着在图中找到旅游景点。我已经写了下面的代码,这似乎是正确的打印旅游。我要它停止,一旦它找到了第一次旅游,并返回旅游名单。然而,递归堆栈似乎已经完成,而我并没有得到想要的结果。当我找到第一个循环,即我的条件满足时,我如何返回一个值并完全停止递归?谢谢。
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=[])发布于 2014-02-06 13:55:35
在找到遍历并返回路径之后,代码继续执行的原因是,它通过边缘将其返回到迭代过程中进行的调用。如果没有中断或返回条件,那么迭代将继续进行(随后会有更多的递归调用)。
下面是您的代码的修改版本,一旦满足了条件,就返回到原始调用(以及递归调用),我添加了一些调试信息,以使过程更加清晰:
#!/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=[])发布于 2014-02-06 13:39:27
在使用递归时,需要将返回值传回整个调用堆栈。通常,这不是使用递归的最佳方式。
在不详细介绍代码的情况下,下面是一个快速建议:
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_valhttps://stackoverflow.com/questions/21603863
复制相似问题