我尝试访问所有节点,返回开始节点(Neamt
)并将访问过的节点添加到path
但问题是如果我到达死胡同,城市已从{ {1}}。
以下是代码产生的path
中的1个:
path
如上面['Neamt', 'Iasi', 'Vaslui', 'Urziceni', 'Bucharest', 'Fagaras', 'Sibiu', 'Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Pitesti', 'Rimnicu Vileea']
所示,没有path
。
真正发生的是我在PyCharm上调试时:'Hirsova', 'Eforie', 'Giurgiu'
已添加到'Hirsova', 'Eforie', 'Giurgiu'
,但随后会从path
中删除。
我希望将这些城市纳入path
作为逆序。例如:
path
为什么会从['Neamt', 'Iasi', 'Vaslui', 'Urziceni', 'Hirsova', 'Eforie', 'Hirsova', 'Urziceni', 'Bucharest', 'Giurgiu', 'Bucharest', 'Pitesti', 'Rimnicu Vileea', 'Craiova', 'Drobeta', 'Mehadia', 'Lugoj', 'Timisoara', 'Arad', 'Zerind', 'Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt',]
中删除它们,因为path
方法与.append
方法没有任何对立?
.delete
答案 0 :(得分:2)
没有删除任何内容,您只是看到find_paths
的不同框架具有不同的path
值。 list(path)
生成副本,因此每个函数调用都会收到自己的列表,一旦函数调用结束,然后向上移动递归堆栈,您会看到一个旧的path
值没有附加节点它
答案 1 :(得分:2)
在输入递归之前和之后,您只需要进行深度优先搜索并添加节点。这会在您启动路径时在列表中放置一个名称,然后在返回途中再次展开。这个过程是:
您需要添加路径结束检查,这样就不会连续两次添加像Eforie这样的城市。如果某个城市没有未经访问过的孩子,则不要再次添加。为此,只需跟踪递归计数。
类似的东西:
def find_paths(node, cities, path, distance, visited = set()):
visited.add(node) # keep track of visited nodes
path.append(node)
# Fork paths for all possible cities not yet used
count = 0 # avoid adding end paths twice
for city in cities[node].keys(): # only recurse on children not the whole list
if city not in visited:
count += 1
find_paths(city, cities, path, distance, visited)
if count > 0 : # only add again if there were children
path.append(node)
a = []
find_paths('Neamt', cities, a, 0)
print(a)
结果
<'Neamt','Iasi','Vaslui','Urziceni','Bucharest','Fagaras','Sibiu','Arad','Timisoara','Lugoj','Mehadia','Drobeta ','Craiova','Pitesti','Rimnicu Vileea','Pitesti','Craiova','Drobeta','Mehadia','Lugoj','Timisoara','Zerind','Oradea','Zerind' ,'Arad','Sibiu','Fagaras','Giurgiu','Bucharest','Hirsova','Eforie','Hirsova','Urziceni','Vaslui','Iasi','Neamt'] < / p>