我在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
答案 0 :(得分:2)
我不知道这是否是您问题的答案,但我注意到的第一件事是您不应该使用列表作为默认函数参数(pathList = []
)。 / p>
答案 1 :(得分:2)
即使搜索失败,您append
robotPos
pathList
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
像
这样的东西{{1}}