2

我在 python 中有一个作业,我应该让一个“机器人”从头到尾,并返回目标的路径。我有机器人搜索,但我希望列表只显示从开始到结束的路径。现在 pathList 返回所有访问过的方格......而且,当涉及到目标时,它不会停止,只是继续其他节点。我错过了什么?

def find(labyrinth, robotPos, pathList = []):

    frontier = adjacent_passages(labyrinth, robotPos)   
    pathList.append(robotPos)

    if len(frontier) == 1:
        print("Corner")
        return []

    for i in range(0, len(frontier)):
        if frontier[i] == goal:
            pathList.append(frontier[i])
            return pathList

    for i in range(0, len(frontier)):
        if frontier[i] not in pathList:
            pathList.append(frontier[i])
            if (find(labyrinth, frontier[i], pathList) == []):
                pathList.pop()

    return pathList
4

2 回答 2

2

我不知道这是否是您问题的答案,但我注意到的第一件事是您不应该使用列表作为默认函数参数(pathList = [])。

请参阅“Least Astonishment”和可变默认参数

于 2012-11-24T02:16:29.623 回答
2

即使搜索失败,您也不会删除它,这就是列表包含所有访问过append的位置的原因。我建议完全避免列表突变(追加/弹出),而是将新值作为参数传递给下一次迭代:robotPospathList

if (find(labyrinth, frontier[i], pathList + [frontier[i]]) == [])...

其他可能的简化是:

  • 下降robotPos。让当前位置成为path参数的最后一项
  • 使用一个循环而不是两个
  • 在循环中,使用for x in stuff而不是for i in range(0, len(stuff))

就像是

def find(path):

    if path[-1] == goal:
        return path

    for new_position in adjacent_positions(path[-1]):
        if new_position not in path:
            found_path = find(path + [new_position])
            if found_path:
                return found_path

    return None
于 2012-11-24T02:21:56.037 回答