Nun, Sie können die Zwischenergebnisse natürlich nicht im Speicher ablegen (es sei denn, Sie haben einen absurden Computer zur Verfügung); Sie müssen die Ergebnisse auf die Festplatte schreiben.
Die Rekursionstiefe hängt nicht von der Anzahl der berücksichtigten Zeichen ab, sondern von der maximalen Länge der Zeichenfolge, die Sie in Betracht ziehen wollen.
Zum Beispiel, meine Installation von Python 2.6.2 hat es standardmäßig Rekursion Grenze auf 1000 gesetzt. Argumentieren, ich sollte in der Lage sein, alle möglichen 1-1000 Länge Zeichenfolgen gegeben einen Zeichensatz innerhalb dieser Begrenzung zu generieren (jetzt, ich denke, die Rekursion Grenze gilt für die gesamte Stapeltiefe, so dass die tatsächliche Grenze weniger als 1000 sein kann).
Bearbeiten (Python-Beispiel hinzugefügt): Das folgende Python-Snippet erzeugt das, wonach Sie fragen (und beschränkt sich dabei auf die angegebenen Laufzeit-Stack-Limits):
from string import ascii_lowercase
def generate(base="", charset=ascii_lowercase):
for c in charset:
next = base + c
yield next
try:
for s in generate(next, charset):
yield s
except:
continue
for s in generate():
print s
Man könnte im Wesentlichen das gleiche in C# durch try/catching auf StackOverflowException produzieren. Während ich dieses Update schreibe, läuft das Skript und beansprucht einen meiner Kerne. Die Speichernutzung liegt jedoch konstant bei weniger als 7 MB. Nun, ich bin nur auf stdout drucken, da ich nicht daran interessiert bin, das Ergebnis zu erfassen, aber ich denke, es beweist den Punkt oben ;)
Nachtrag zum Beispiel: Interessante Anmerkung: Wenn man sich die laufenden Prozesse genauer ansieht, ist Python im obigen Beispiel tatsächlich I/O-gebunden. Es verwendet nur 7% meiner CPU, während der Rest des Kerns gebunden ist, die Ergebnisse in meinem Befehlsfenster wiederzugeben. Das Minimieren des Fensters lässt Python auf 40% der gesamten CPU-Auslastung ansteigen, und das auf einem 2-Kern-Rechner.