Generatory rekurencyjne w Pythonie

Napisałem funkcję zwracającą generator zawierający każdą unikalną kombinację podciągów o określonej długości, która zawiera więcej niż n elementów z głównego ciągu.

Jako ilustrację:

jeśli mam „abcdefghi” i sondę o długości dwóch, a próg 4 elementów na listę chciałbym uzyskać:

<code>['ab', 'cd', 'ef', 'gh']
['ab', 'de', 'fg', 'hi']
['bc', 'de', 'fg', 'hi']
</code>

Moja pierwsza próba rozwiązania tego problemu polegała na zwrocie listy list. To skończyło się przepełnieniem pamięci komputera. Jako surowe rozwiązanie wtórne stworzyłem generator, który robi coś podobnego. Problem polega na tym, że stworzyłem zagnieżdżony generator, który sam się wywołuje. Kiedy uruchamiam tę funkcję, wydaje się, że po prostu pętli wokół wewnętrznej pętli for bez faktycznego wywoływania siebie. Pomyślałem, że generator będzie poprzedzał dziurę rekurencyjną tak daleko, jak to konieczne, aż trafi na deklarację wydajności. Jakieś wskazówki co się dzieje?

<code>def get_next_probe(self, current_probe_list, probes, unit_length):
    if isinstance(current_probe_list, list):
        last_probe=current_probe_list[-1]
        available_probes = [candidate for candidate in probes if candidate.start>last_probe.end]
    else:
        available_probes = [candidate for candidate in probes if candidate.start<unit_length]

    if available_probes:

        max_position=min([probe.end for probe in available_probes])
        available_probes2=[probe for probe in available_probes if max_position+1>probe.start]

        for new_last_probe in available_probes2:
            new_list=list(current_probe_list)
            new_list.append(new_last_probe)
            self.get_next_probe(new_list, probes, unit_length)

    else:
        if len(current_probe_list)>=self.num_units:
            yield current_probe_list
</code>

Jeśli wydajność zostanie zmieniona, aby wydrukować, to działa dobrze! Byłbym wdzięczny za każdą pomoc, jaką mógłbym uzyskać. Zdaję sobie sprawę, że nie jest to optymalna implementacja tego typu problemu wyszukiwania, wydaje się, że zwrot listy znalezionych pozycji z ostatniego wywołania get_next_probe i filtrowanie tej listy dla elementów, które nie nakładają się na new_last_probe.end, byłby znacznie bardziej wydajny ... ale to było dla mnie dużo łatwiejsze do napisania. Wszelkie dane wejściowe algorytmu będą nadal doceniane.

Dzięki!

questionAnswers(1)

yourAnswerToTheQuestion