Rekursive Generatoren in Python

Ich habe eine Funktion geschrieben, die einen Generator zurückgibt, der jede eindeutige Kombination von Teilzeichenfolgen einer bestimmten Länge enthält, die mehr als n Elemente aus einer Primärzeichenfolge enthält.

Als Illustration:

Wenn ich 'abcdefghi' und eine Sonde mit einer Länge von zwei und einem Schwellenwert von 4 Elementen pro Liste habe, möchte ich Folgendes bekommen:

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

Mein erster Versuch, dieses Problem zu lösen, bestand darin, eine Liste von Listen zurückzugeben. Dadurch wurde der Arbeitsspeicher des Computers überfüllt. Als grobe Sekundärlösung habe ich einen Generator entwickelt, der etwas Ähnliches leistet. Das Problem ist, dass ich einen verschachtelten Generator erstellt habe, der sich selbst aufruft. Wenn ich diese Funktion ausführe, scheint sie nur die innere for-Schleife zu durchlaufen, ohne sich selbst erneut aufzurufen. Ich dachte, dass ein Generator dem Rekursionsloch so weit vorausgehen würde, bis es die Ertragsaussage traf. Irgendeine Ahnung, was passiert?

<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>

Wenn der Ertrag zum Drucken geändert wird, funktioniert dies einwandfrei! Ich würde mich über jede Hilfe freuen, die ich bekommen könnte. Mir ist klar, dass dies keine optimale Implementierung dieser Art von Suchproblem ist. Es scheint, als würde eine Liste der gefundenen Positionen aus dem letzten Aufruf von get_next_probe zurückgegeben, und das Filtern dieser Liste nach Elementen, die new_last_probe.end nicht überlappen, wäre weitaus effizienter ... aber das war viel einfacher für mich zu schreiben. Jede Eingabe eines Algorithmus wäre immer noch willkommen.

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage