Уже есть нерекурсивное, ленивое решение, доступное через модуль itertools
:
>>> import itertools
>>> routes = itertools.product(range(10), repeat=10)
Каждое значение генерируется по требованию, когда вы перебираете routes
, а не сохраняете все 10 миллиардових в памяти сразу.
>>> print(list(itertools.islice(routes, 20)))
[(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0, 0, 1), (0, 0, 0, 0, 0, 0, 0, 0, 0, 2), (0, 0, 0, 0, 0, 0, 0, 0, 0, 3), (0, 0, 0, 0, 0, 0, 0, 0, 0, 4), (0, 0, 0, 0, 0, 0, 0, 0, 0, 5), (0, 0, 0, 0, 0, 0, 0, 0, 0, 6), (0, 0, 0, 0, 0, 0, 0, 0, 0, 7), (0, 0, 0, 0, 0, 0, 0, 0, 0, 8), (0, 0, 0, 0, 0, 0, 0, 0, 0, 9), (0, 0, 0, 0, 0, 0, 0, 0, 1, 0), (0, 0, 0, 0, 0, 0, 0, 0, 1, 1), (0, 0, 0, 0, 0, 0, 0, 0, 1, 2), (0, 0, 0, 0, 0, 0, 0, 0, 1, 3), (0, 0, 0, 0, 0, 0, 0, 0, 1, 4), (0, 0, 0, 0, 0, 0, 0, 0, 1, 5), (0, 0, 0, 0, 0, 0, 0, 0, 1, 6), (0, 0, 0, 0, 0, 0, 0, 0, 1, 7), (0, 0, 0, 0, 0, 0, 0, 0, 1, 8), (0, 0, 0, 0, 0, 0, 0, 0, 1, 9)]
>>> print(list(itertools.islice(routes, 20)))
[(0, 0, 0, 0, 0, 0, 0, 0, 2, 0), (0, 0, 0, 0, 0, 0, 0, 0, 2, 1), (0, 0, 0, 0, 0, 0, 0, 0, 2, 2), (0, 0, 0, 0, 0, 0, 0, 0, 2, 3), (0, 0, 0, 0, 0, 0, 0, 0, 2, 4), (0, 0, 0, 0, 0, 0, 0, 0, 2, 5), (0, 0, 0, 0, 0, 0, 0, 0, 2, 6), (0, 0, 0, 0, 0, 0, 0, 0, 2, 7), (0, 0, 0, 0, 0, 0, 0, 0, 2, 8), (0, 0, 0, 0, 0, 0, 0, 0, 2, 9), (0, 0, 0, 0, 0, 0, 0, 0, 3, 0), (0, 0, 0, 0, 0, 0, 0, 0, 3, 1), (0, 0, 0, 0, 0, 0, 0, 0, 3, 2), (0, 0, 0, 0, 0, 0, 0, 0, 3, 3), (0, 0, 0, 0, 0, 0, 0, 0, 3, 4), (0, 0, 0, 0, 0, 0, 0, 0, 3, 5), (0, 0, 0, 0, 0, 0, 0, 0, 3, 6), (0, 0, 0, 0, 0, 0, 0, 0, 3, 7), (0, 0, 0, 0, 0, 0, 0, 0, 3, 8), (0, 0, 0, 0, 0, 0, 0, 0, 3, 9)]