1 回答
TA贡献1813条经验 获得超2个赞
问题是函数执行对components_c,nodes_c进行的修改必须带回调用者的同名变量,但这并没有发生,因为这些变量在它们自己的函数执行上下文中是本地的。具有这些名称的调用者变量不会被它进行的递归调用修改,但它们应该被修改。
你可以用不同的方式解决这个问题。一种方法是做dfs_scc一个定义在 内的函数scc,并且在 的范围内只定义上面提到的两个变量scc。然后dfs_scc可以通过关键字引用这些变量nonlocal而不是将它们作为参数获取,因此以递归树中所有执行上下文都能看到的方式修改它们。
这是它的样子:
def scc(graph):
components_c=nodes_c=0
# define the recursive function with the scope where the above variables are defined
def dfs_scc(graph, node, connected_components, visited_nodes):
nonlocal components_c, nodes_c # reference those variables
nodes_c+=1
connected_components[node]=-nodes_c
visited_nodes.append(node)
last=nodes_c
for adj in graph.get_adj(node):
if (connected_components[adj[1]]==0):
b=dfs_scc(graph, adj[1], connected_components, visited_nodes)
last=min(last, b)
elif (connected_components[adj[1]]<0):
last=min(last, -connected_components[adj[1]])
if (last==-connected_components[node]):
components_c+=1
print('VISITED NODE QUEUE: ', list(visited_nodes), '; COMPONENTS COUNTER: ', components_c)
while(visited_nodes[-1]!=node):
w=visited_nodes.pop()
connected_components[w]=components_c
w=visited_nodes.pop()
connected_components[w]=components_c
return last
#connected_components : {npde0: components, node1: components, node2: components, node3 : components, ...}
connected_components={graph.get_nodes()[i]: 0 for i in range(len(graph.get_nodes()))}
visited_nodes=deque()
for node in graph.get_nodes():
if (connected_components[node]==0):
dfs_scc(graph, node, connected_components, visited_nodes)
return connected_components
添加回答
举报