首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归条件满足时的返回值

递归条件满足时的返回值
EN

Stack Overflow用户
提问于 2014-02-06 13:05:53
回答 2查看 1.4K关注 0票数 1

我正试着在图中找到旅游景点。我已经写了下面的代码,这似乎是正确的打印旅游。我要它停止,一旦它找到了第一次旅游,并返回旅游名单。然而,递归堆栈似乎已经完成,而我并没有得到想要的结果。当我找到第一个循环,即我的条件满足时,我如何返回一个值并完全停止递归?谢谢。

代码语言:javascript
复制
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=[])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-06 13:55:35

在找到遍历并返回路径之后,代码继续执行的原因是,它通过边缘将其返回到迭代过程中进行的调用。如果没有中断或返回条件,那么迭代将继续进行(随后会有更多的递归调用)。

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

代码语言:javascript
复制
#!/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=[])
票数 0
EN

Stack Overflow用户

发布于 2014-02-06 13:39:27

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

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21603863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档