很抱歉,标题误导了我,但我不能用其他任何方式来写。
我正在尝试实现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
它应该总是返回第一种情况,但是当我调查时,我发现第二个呼叫已经“访问过”。
如果我调用如下函数:
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
效果很好...
如果有人可以解释为什么发生这种现象,以及是否有避免这种现象的方法,我将不胜感激。
谢谢!
答案 0 :(得分:1)
您将visited
数组用作可变的默认参数,根据http://code.activestate.com/recipes/577786-smarter-default-arguments/的定义,该参数实际上只初始化一次为空数组。
在随后的对rec_dfs()
的每次调用期间,如果未明确初始化visited
数组,则它将在每次后续的函数调用期间保持其状态。