我需要使用边缘的权重找到从一个给定节点到另一个节点的最短距离。我将以下图形存储为字典: A visual representation of the graph
我尝试使用递归方法,但到目前为止我似乎还是失败了。 这是我正在使用的字典:
towns = {'kendal': [['penrith', 28], ['milnthorpe', 8], ['barrow', 35]],
'penrith': [['kendal', 28]],
'barrow': [['kendal', 35], ['milnthorpe', 31]],
'milnthorpe': [['kendal', 8], ['barrow', 31], ['lancaster', 14]],
'lancaster': [['milnthorpe', 14]]
}
用户输入开始和结束节点:
places = ['kendal', 'penrith', 'barrow', 'milnthorpe', 'lancaster']
from_town = ''
while from_town not in places:
from_town = input('Where are you going from?').lower()
to_town = ''
while to_town not in places:
to_town = input('Where are you going to?').lower()
然后运行以下代码,它可以直接连接到起始节点上的节点轻松工作,否则,递归将继续并且不会停止。
routes = []
def get_route(start, finish):
others = []
for x in range(len(towns[start])):
if towns[start][x][0] == finish:
routes.append(towns[start][x][1])
else:
if towns[start][x][0] not in others:
others.append(towns[start][x][0])
for y in range(len(others)):
get_route(others[y], to_town)
get_route(from_town, to_town)
routes.sort()
print(routes[0], 'miles')
我知道我还没有停止递归的方法,但是我需要的是程序列出所有可能路线的列表。
答案 0 :(得分:0)
您有几个问题;我建议您备份并使用增量编程,以便一次只能处理一个。从几行代码开始;在添加更多内容之前调试它们。例如,编写一个例程以检查直接路由,否则返回失败。在进行任何递归操作之前,请先充分利用该功能。
目前,您的主要问题在这里:
for y in range(len(others)):
get_route(others[y], to_town)
由于递归不涉及您去过的地方的“记忆”,因此递归执行无限的回溯和循环。摆脱这种情况的唯一方法是,对于所有活动呼叫,others
为空。
我建议您查询Dijkstra's algorithm,以帮助您跟踪已访问过的地方。
还请注意,您的函数不返回任何内容。您有一个未初始化的局部变量routes
;这与主程序中的不是相同。