I am stuck on day5 of this year’s AOC. I try to do it all in python as to learn it.
In short, the task needs a graph traversal. I chose to do it with DFS.
The following code snipped works:
nodes = [*self.adj_list.keys()]
node_states = [TopologicalStates.WHITE for _ in nodes]
predecessors = []
def visit_node(node_index, node):
node_states[node_index] = TopologicalStates.GRAY
adj_nodes = self.adj_list[node]
for adj_node in adj_nodes:
adj_node_index = nodes.index(adj_node)
if node_states[adj_node_index] == TopologicalStates.WHITE:
visit_node(adj_node_index, adj_node)
node_states[node_index] = TopologicalStates.BLACK
predecessors.append(node)
for (node_index, node) in enumerate([predecessor for (predecessor, successors) in self.adj_list.items() if node in successors]):
if node_states[node_index] == TopologicalStates.WHITE:
visit_node(node_index, node)
return predecessors
However, as soon as I try to remove the node_index
parameter from visit_node
and instead define a new variable at the top of visit_node
like below, I get infinite recursion!
nodes = [*self.adj_list.keys()]
node_states = [TopologicalStates.WHITE for _ in nodes]
predecessors = []
def visit_node(node):
node_index = nodes.index(p)
node_states[node_index] = TopologicalStates.GRAY
adj_nodes = self.adj_list[node]
for adj_node in adj_nodes:
adj_node_index = nodes.index(adj_node)
if node_states[adj_node_index] == TopologicalStates.WHITE:
visit_node(adj_node)
node_states[node_index] = TopologicalStates.BLACK
predecessors.append(node)
for (i, p) in enumerate([predecessor for (predecessor, successors) in self.adj_list.items() if node in successors]):
if node_states[i] == TopologicalStates.WHITE:
visit_node(p)
return predecessors
I started a debug session to only find out that node_states
has an initial value, or rather, does not seem to persist node_states[node_index] = TopologicalState.GRAY
calls between recursion calls.
How is this possible? What am I doing wrong? Is it a “my computer” issue?
Thanks, any help is appreciated