I've been trying to learn recursive algorithms lately, and I've run into a dead end. Given a certain number of lists, each of which represents the time it takes to go from one shop to all others, and a list containing a sequence of time intervals, is there a way to find all possible routes between shops using recursivity?
For example
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]
Shops can only be visited once. We can see that 3 shops have been visited at 2 minute intervals and that the possible routes are:
shop4 > shop2 > shop1
shop3 > shop1 > shop2
So I'm trying to resolve the problem above with the desired output using the following code:
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)
And it works in some cases, but definitely not in all cases. It's supposed to give me all the possible routes based on the given time intervals, however, it doesn't seem to work in a lot of cases.
For example if I change shops and times to:
shops = [[0,1,1,1],[1,0,1,1],[1,1,0,1],[1,1,1,0]]
times = [0, 1, 1]
it gives an output of 2 possiblities -> starting from shop2 = [2,0,1] and -> starting from shop3 = [3,0,1]. Is there any way to make my algorithm work?