【发布时间】:2022-01-12 21:20:10
【问题描述】:
我正在尝试创建一个递归寻路函数,但无论是否存在可能的路径,它总是返回 None。
查找起点和终点的功能起作用。
my_map = """
#####
#..E#
#.###
#S..#
#####
""".splitlines()
def find_start(map, symbol):
for y, line in enumerate(map):
for x, char in enumerate(line):
if char == symbol:
return x - 1, y
def find_end(map, symbol):
for y, line in enumerate(map):
for x, char in enumerate(line):
if char == symbol:
return x - 1, y
def neighbours(map, x, y, wall_symbol=None):
return [e for e in [(x+1, y), (x-1, y), (x, y+1), (x, y-1)] if e[0] >= 0 and e[1] >= 0 and e[0] < len(map[0]) and e[1] < len(map) and map[e[1]][e[0]] != wall_symbol]
def find_path_recursive(map, start, end, wall_symbol=None, path=None):
if path is None:
path = []
path = path + [start]
if start == end:
return path
for next in neighbours(map, *start, wall_symbol):
if next not in path:
newpath = find_path_recursive(map, next, end, wall_symbol, path)
if newpath:
return newpath
return None
print(find_path_recursive(my_map, find_start(my_map, 'S'), find_end(my_map, 'E'), '#'))
实际结果:
>>> None
预期结果:
>>> [(1, 3), (1, 2), (1, 1), (2, 1), (3, 1)]
【问题讨论】:
-
当你一步一步地浏览它时,执行中是否有任何地方看起来不正确?你在使用 IDE 吗?它可能具有调试功能,可让您逐步执行程序并检查值/条件。
-
尝试添加“print”语句,并使用较小的示例,例如“SE”
-
neighbours()返回一个空列表,所以find_path_recursive()几乎立即返回 None。 -
嗯,你说得对,我要修复邻居函数中的 if 语句,问题来自
e[0] >= 0 and e[1] >= 0 and e[0] < len(map[0]) and e[1] < len(map)
标签: python recursion path-finding