Ich stoße seit einigen Tagen immer wieder an das Rekursionslimit.
Bin momentan hauptsächlich mit esoterischen Sprachen beschäftigt, wo oft
ein Code-Fragment aus dem Netz in Sprache XXX unter Unständen
stark auf Rekursion setzt. Das übertrage ich dann 1:1 nach Python
und stoße eben bald ans Limit.
In vielen Fällen ist es recht einfach, eine Schleife aus der Funktion
zu machen, aber manchmal ist es eher schwierig.
Möchte euch bitten, mir bei der Umgehung zu helfen.
Folgende Möglichkeiten fallen mir ein:
1.) Neu compilen und das Rekursionslimit hinaufsetzen.
(ist aber eigentlich keine Lösung)
2.) Es gibt irgendwo ein Modul, daß einfachen Python-Code nach C
überträgt. Könnte klappen, da in C der Stack nicht so schnell ausgeht.
Ich hätte aber lieber "richtiges" Python.
3.) Ich könnte endrekursive Funktionen suchen und mit der üblichen
Optimierung auf O(1) Speicherverbrauch bringen. Das wäre schon was!
4.) Ich könnte Python patchen. Keine Ahnung, ob das Rekursionslimit
wirklich wichtig ist, aber ich denke nicht, daß es ganz umsonst da ist.
4. wäre schrecklich, und wahrscheinlich zu viel Arbeit.
Mit 2. habe ich keine Erfahrung, ich wäre über Hinweise dankbar.
Allerdings müßte man immer neu compilen, wenn man C-Code erzeugt.
3. wäre sehr toll. Meine Frage zu 3:
Wenn ich solche "metasyntaktischen" Umformungen programmieren will, wo setze ich am besten an?
Wahrscheinlich eher am Syntax-Baum als am
Quelltext. Ist das sehr kompliziert?
Noch ein Beispiel zu 3:
Code: Alles auswählen
def fak(n, a=1):
if n == 1:
return a
else:
return fak(n - 1, n * a)
# wird zu
def fak(n, a=1): # a bleibt der Einfachheit halber stehen
args = n, a
while not args[0] == 1:
args = args[0] - 1, args[0] * args[1]
return args[1]
Danke schon jetzt!