Python DFS 递归函数保留上一次调用的值
Python DFS recursive function retaining values from previous call
如果标题有误导性,我很抱歉,但我无法以任何其他方式表达。
我正在尝试实现 bfs 和 dfs 以记住一些概念,但是代码的递归版本会出现奇怪的行为。
这是正在发生的事情:
def rec_dfs(g, start_node, visited=[]):
visited.append(start_node)
for next_node in g[start_node]:
if next_node not in visited:
rec_dfs(g, next_node, visited)
return visited
graph2={'A': ['B', 'C', 'D'],
'B': ['A', 'E', 'F'],
'C': ['A', 'F'],
'D': ['A'],
'E': ['B'],
'F': ['B', 'C']}
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D'] OK
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D', 'A'] NOK
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D', 'A', 'A'] NOK
它应该总是 return 第一种情况,但是当我调查时我可以看到第二个调用已经 "visited" 填充。
如果我像这样调用函数:
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D'] OK
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D'] OK
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D'] OK
它工作得很好...
如果有人能解释为什么会发生这种行为,以及是否有办法避免这种情况,我将不胜感激。
谢谢!
您正在使用 visited
数组作为可变默认参数,根据 http://code.activestate.com/recipes/577786-smarter-default-arguments/.
,它在定义时基本上只初始化为一个空数组一次
在每次后续调用 rec_dfs()
期间,如果 visited
数组未明确重新初始化,它将在后续每次函数调用期间保持其状态。
如果标题有误导性,我很抱歉,但我无法以任何其他方式表达。
我正在尝试实现 bfs 和 dfs 以记住一些概念,但是代码的递归版本会出现奇怪的行为。
这是正在发生的事情:
def rec_dfs(g, start_node, visited=[]):
visited.append(start_node)
for next_node in g[start_node]:
if next_node not in visited:
rec_dfs(g, next_node, visited)
return visited
graph2={'A': ['B', 'C', 'D'],
'B': ['A', 'E', 'F'],
'C': ['A', 'F'],
'D': ['A'],
'E': ['B'],
'F': ['B', 'C']}
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D'] OK
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D', 'A'] NOK
rec_dfs(graph2, "A") #['A', 'B', 'E', 'F', 'C', 'D', 'A', 'A'] NOK
它应该总是 return 第一种情况,但是当我调查时我可以看到第二个调用已经 "visited" 填充。
如果我像这样调用函数:
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D'] OK
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D'] OK
rec_dfs(graph2, "A", []) #['A', 'B', 'E', 'F', 'C', 'D'] OK
它工作得很好...
如果有人能解释为什么会发生这种行为,以及是否有办法避免这种情况,我将不胜感激。
谢谢!
您正在使用 visited
数组作为可变默认参数,根据 http://code.activestate.com/recipes/577786-smarter-default-arguments/.
在每次后续调用 rec_dfs()
期间,如果 visited
数组未明确重新初始化,它将在后续每次函数调用期间保持其状态。