在Python中递归使用Parents数组查找路径

时间:2015-03-19 22:49:16

标签: python recursion path-finding

所以我有一个任务,就是编写一个函数,它接受遍历,起始顶点和结束顶点生成的父数组,并生成从起始顶点到结束顶点的路径。

我试过为此编写代码

def tree_path(parents, start, end):
    if ((start == end) or (end == -1)):
        return [start, end]
    else:
        return tree_path(parents, start, parents[end])

它没有按照我的意图去做。我不太擅长递归。任何帮助将非常感激。感谢

2 个答案:

答案 0 :(得分:1)

您继续递归start==end,然后返回[start,end]。那总是[start,start](因为start==end),所以你什么都学不到。您只需要在第一个return语句中返回[start],因为返回[start,end]将返回具有相同元素两次的列表。另一个return语句也需要添加一些东西;否则,您只需返回两个元素:return tree_path(parents, start, parents[end]) + [end]

这也是一个问题,但是(我假设)。 parents[end]是(我认为)父母的名单。但是,tree_path()只占用一个端节点。你需要迭代它们以查看哪一个有效(如果我错了它是一个列表,只需忽略这部分并使用上面的代码):

for i in parents[end]:
    path = tree_path(parents,start,i):
    if path:
        return path + [end]

这假设tree_path()在找不到路径时返回false值。您需要检查end是否为根节点。我认为这是end==-1检查的作用。把它们放在一起,你得到这样的东西:

def tree_path(parents, start, end):
    if end==-1:
        return None
    if start==end:
        return [end]
    else:
        for i in parents[end]:
            path = tree_path(parents,start,i):
            if path:
                return path + [end]

答案 1 :(得分:0)

您可以尝试,假设我们需要从startend的所有顶点的列表,如下所示:

def tree_path(parents, start, end):
    if (start == end) or (end == -1):
        return [start]
    else:
        return tree_path(parents, start, parents[end]) + [end]

如果startend重合,那么我们的路径只包含一个顶点:start。否则,我们会找到从startend的父级的路径,并且在此路径中我们会添加end节点。