【问题标题】:Why is my recursive path finding function returning None when a path exists为什么当路径存在时我的递归寻路函数返回 None
【发布时间】: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] &gt;= 0 and e[1] &gt;= 0 and e[0] &lt; len(map[0]) and e[1] &lt; len(map)

标签: python recursion path-finding


【解决方案1】:

问题来自neighbours 函数,该函数返回一个空列表(感谢John Gordon 的注意),删除e[0] &gt;= 0 and e[1] &gt;= 0 and e[0] &lt; len(map[0]) and e[1] &lt; len(map) 后代码运行良好(感谢Python 使用列表索引的方式):

my_map = """#####\n#..E#\n#.###\n#S..#\n#####""".splitlines()

def find_start(map, symbol):
    for y, line in enumerate(map):
        for x, char in enumerate(line):
            if char == symbol:
                return x, y

def find_end(map, symbol):
    for y, line in enumerate(map):
        for x, char in enumerate(line):
            if char == symbol:
                return x, 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 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'), '#'))

结果:

>>> [(1, 3), (1, 2), (1, 1), (2, 1), (3, 1)]

【讨论】:

    猜你喜欢
    • 2021-11-13
    相关资源
    最近更新 更多