我最近一直在尝试学习递归算法,但是遇到了瓶颈。给定若干个列表,每个列表代表从一个商店到其他所有商店所需的时间,以及包含一系列时间间隔的列表,是否有办法使用递归来查找商店之间的所有可能路径?
例如:
例如:
list_of_shops = [shop1, shop2, shop3, shop4]
# Index for this list and the one below are the same
list_of_time_it_takes = [[0, 2, 1, 4], [2, 0, 1, 4], [2, 1, 0, 4], [1, 2, 3, 0]]
# the 0 indicates the index of the shop. It takes 0 minutes to reach the shop from itself.
list_of_time_intervals = [0, 2, 2]
商店只能被访问一次。我们可以看到在2分钟间隔内已经访问了3个商店,可能的路线有:
商店4 > 商店2 > 商店1
商店3 > 商店1 > 商店2
所以我正在尝试使用以下代码解决上述问题并得到期望的输出:
shops = [[0, 2, 1, 4, 9], [2, 0, 1, 4, 9], [2, 1, 0, 4, 9], [1, 2, 3, 0, 11], [3, 6, 16, 4, 0]]
times = [0, 2, 2, 4, 11]
list_of_shops = ['shop0', 'shop1', 'shop2', 'shop3', 'shop4']
index_dict = {}
def function(shops_input, times_input, i, index_list):
#print("given i = ", i)
#print("given shops = ", shops_input)
#print("given times = ", times_input)
shops_copy, times_copy = shops_input[:], times_input[:]
pop = times_copy.pop(0)
#print("obtained pop = ", pop)
if shops[i] in shops_copy:
index_list.append(shops.index(shops[i]))
shops_copy.pop(shops_copy.index(shops[i]))
if len(index_list) == len(times):
index_dict[list_of_shops[index_list[0]]] = index_list
print(index_list)
print(index_dict)
if len(times_copy):
try:
function(shops_copy, times_copy, shops[i].index(times_copy[0]), index_list)
except ValueError:
return
def main_function(shops, times):
for i in range(len(shops)):
function(shops, times, i, [])
print("---------end funct---------")
main_function(shops, times)
在某些情况下,它可以工作,但绝对不是所有情况。根据给定的时间间隔,它应该为我提供所有可能的路线,然而,在许多情况下它似乎并不起作用。
例如,如果我将商店和时间更改为:
shops = [[0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0]]
times = [0, 1, 1]
该算法有两种可能的输出结果,分别从 [2,0,1] 和 [3,0,1] 开始执行。是否有办法让我的算法正常工作?