python深度优先搜索递归

时间:2017-09-24 14:11:01

标签: python recursion dfs

我正在尝试使用递归使python dfs连接岛...

程序运行正常,但在某些情况下会出现输出不正确的逻辑错误

例如

.gitignore

然而,在其他情况下

o o o

o x x

o o o the output is 1 which is correct.

这是我的完整代码,包括dfs函数

o x o

o x o

o o o the output is 2 which is incorrect.

在我看来,我的逻辑错误是我两次访问被访问节点,但是我的数组中似乎没有错误。你能否就我的错误在哪里提出一些建议?

非常感谢你的时间,欢呼声

编辑:我已经更新为社区请求的完整代码版本(如何调用函数,全局变量等)

1 个答案:

答案 0 :(得分:0)

代码中的某些内容没有意义:

1)如果要从dfs函数返回一个值,该值应该有一些含义,应该使用它。如果您只为其副作用调用函数,则只能return没有值。在这种情况下,我认为dfs函数的目的是更新visited数组,因此您无需返回10或任何东西。

2)当您在图形中执行深度优先搜索时,从一个节点开始,并以递归方式访问其连接的节点。如果你在dfs函数中有一个for循环访问图的大部分,忽略连接,那么你不是在做DFS。通常,您只需要在连接的节点上递归调用dfs函数。

3)你的函数现在的样子,似乎在进行任何递归调用之前总会返回1

另请注意以下Python代码的良好实践:

1)避免像if expression == True:这样的结构。而是使用if expression:。而不是if expression == False,请使用if not expression

2)避免在ifelif子句中的条件表达式周围使用括号,与C或Java不同,它不是必需的。例如,代替elif (a == b):使用elif a == b

3)在函数顶部添加docstring,以描述函数的作用(参见下面的代码示例)。

根据我的理解,您希望dfs函数的每次调用都能访问构成岛屿的所有连接的x。您可以使用以下代码执行此操作:

def dfs(i,j):
    '''
    This function starts from the square with coordinates (i,j).

    The square (i,j) should be an 'x', and also unvisited.

    This function will keep visiting all adjacent 'x' squares, using a
    depth first traversal, and marking these squares as visited in the
    @visited array.

    The squares considered adjacent are the 8 surrounding squares:
    (up, up-right, right, down-right, down, down-left, left, up-left).
    '''

    # The range checks have been moved to the beginning of the function, after each call.
    # This makes the code much shorter.
    if i < 0 or j < 0 or i >= row or j >= col:
        return

    # If we reached a non-x square, or an already visited square, stop the recursion.
    if peta[i][j] != 'x' or visited[i][j]:
        # Notice that since we don't do something with the return value,
        # there is no point in returning a value here.
        return

    # Mark this square as visited.
    visited[i][j] = True

    # Visit all adjacent squares (up to 8 squares).
    # Don't worry about some index falling out of range,
    # this will be checked right after the function call.
    dfs(i-1,j-1)
    dfs(i-1,j)
    dfs(i-1,j+1)
    dfs(i,j-1)
    dfs(i,j+1)
    dfs(i+1,j-1)
    dfs(i+1,j)
    dfs(i+1,j+1)