Итак, скажем, у меня есть несколько узлов. Каждый узел имеет список узлов, к которым он может перейти. Этот список узлов может включать сам. Мне нужно создать все возможные пути, которые узел может принимать, которые имеют длину n.Выход из рекурсивной функции
Например: допустим несколько вещей.
- У меня есть узел А и узел В
- мне нужны все возможные пути, которые не являются три длинные (не короче)
- Узел может пойти к себе и узел В
- Узел B может идти к себе и узел а
Предполагая, что тогда все пути я могу построить являются:
- А.А.
- AAB
- ABA
- ABB
- BAA
- BAB
- BBA
- ВВВ
Это код, я прямо сейчас; он работает, но в моем фактическом случае мне нужно, чтобы пути были длинными с восемью узлами. Это, очевидно, приводит к некоторым проблемам с производительностью. Я попал в MemoryError, работающий на 32-битной версии Python2.7. Я еще не пробовал 64-битную версию. Очевидная проблема - моя текущая реализация. Я думал, что, возможно, использование урожая/генераторов поможет некоторым. Не так ли? Если да, то как я мог бы реализовать использование урожая в моем случае?
Также я не ограничен Python 2, если у Python 3 есть некоторые функции, которые достигнут того, что я прошу. Python 2 - это то, что на моем самом эффективном компьютере.
PARTS = 3
def dive(node, depth=0):
combos = []
if depth >= PARTS - 1:
if node.key:
return ((node.key,),)
return()
for next_ in node.next_nodes:
for combo in dive(next_, depth=depth+1):
if not node.key:
continue
combos.append((node.key,) + combo)
return combos
Это не работает. Я просто никогда не использовал урожай слишком много, поэтому я не знаю, как с ним работать. Я знаю, что странные вещи начинают происходить не благодаря рекурсии, я уверен. –
он не работает, не очень помогает при диагностике, почему он не работает ... это обязательно должно ... Я думаю, что не менее –
Не знаю, что будет работать в Python2 +. Но в Python 3.3+ использование 'yield from' и добавление' return' под первым выходом для предотвращения бесконечной рекурсии. –