Rekursive Generatoren in Python

8

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

Zur Veranschaulichung:

Wenn ich 'abcdefghi' und eine Sonde der Länge zwei und eine Schwelle von 4 Elementen pro Liste habe, die ich gerne bekommen würde:

%Vor%

Mein erster Versuch bei diesem Problem bestand darin, eine Liste von Listen zurückzugeben. Dies endete damit, dass die Erinnerung an den Computer überflutet wurde. Als grobe Nebenlösung habe ich einen Generator geschaffen, der etwas Ähnliches macht. 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 tatsächlich selbst wieder anzurufen. Ich dachte, dass ein Generator bis zum Ende der Rekursionsbohrung vorausgehen würde, bis er die yield-Anweisung trifft. Irgendeine Ahnung was passiert?

%Vor%

Wenn die Ausbeute zum Drucken geändert wird, funktioniert das gut! Ich würde jede Hilfe, die ich bekommen könnte, schätzen. Ich weiß, dass dies keine optimale Implementierung dieser Art von Suchproblemen ist, es scheint, als würde man eine Liste gefundener Positionen vom letzten Aufruf von get_next_probe zurückgeben und diese Liste nach Elementen filtern, die new_last_probe.end nicht überlappen ... aber das war viel einfacher für mich zu schreiben. Jede Algorithmuseingabe würde immer noch geschätzt werden.

Danke!

    
user1348971 22.04.2012, 01:20
quelle

1 Antwort

17
  

Ich dachte, dass ein Generator so weit nach unten in das Rekursionsloch gehen würde, bis er die yield-Anweisung trifft

Es wird gut rekrutieren, aber um den yield ed-Wert wieder nach außen zu propagieren, müssen Sie es explizit tun - genau wie wenn es ein return wäre, müssten Sie explizit return das Ergebnis von jede Rekursion. Also statt:

%Vor%

Sie würden etwas tun wie:

%Vor%

Oder wenn Sie Python 3.3 oder neuer verwenden, können Sie das auch tun:

%Vor%     
lvc 22.04.2012, 02:00
quelle