Попробуйте это.
neighbors = {0: [8],
1: [2,4],
2: [1,4,3],
3: [2,6],
4: [1,5,7],
5: [2,4,6,8],
6: [3,5,9],
7: [4,8],
8: [7,5,9,0],
9: [6,8]}
def get_sequences(n):
if not n:
return
stack = [(i,) for i in range(10)]
while stack:
cur = stack.pop()
if len(cur) == n:
yield cur
else:
stack.extend(cur + (d, ) for d in neighbors[cur[-1]])
print list(get_sequences(3))
Это произведет все возможные последовательности. Вы не упомянули, хотите ли вы те, в которых есть циклы, например (0, 8, 9, 8)
, поэтому я оставил их. Если вы не хотите их использовать, просто используйте
stack.extend(cur + (d, )
for d in neighbors[cur[-1]]
if d not in cur)
Обратите внимание, что я сделал запись для 0
списка с одним элементом вместо целого числа. Это для последовательности. Очень приятно иметь возможность индексировать в словарь и знать, что вы получите список обратно.
Также обратите внимание, что это не рекурсивно. Рекурсивные функции великолепны в языках, которые должным образом их поддерживают. В Python вы почти всегда должны управлять стеком, как я продемонстрирую здесь. Это так же просто, как и рекурсивное решение, и издержки на вызов функции обхода (python не поддерживает хвостовую рекурсию) и проблемы максимальной глубины рекурсии.