2 Funktionen rufen einander auf, dennoch keine Schleife?!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
derrick
User
Beiträge: 34
Registriert: Mittwoch 8. Juni 2011, 20:32

Abend,

ich verstehe nicht warum es zwischen den Funktionen

Code: Alles auswählen

plus(x)
und

Code: Alles auswählen

star(x)
im folgenden Code nicht zu
einem hin und her gegenseitiger Aufrufe kommt. Ich stelle die Frage nicht, weil ich glaube, dass ihr alle ganz
wild darauf seid euch in den (komplexen?) Code einzuarbeiten, sondern weil ich hoffe, dass jemand das Muster
erkennt und dann weiß warum keine Aufrufschleife zwischen den Funktionen entsteht.

Der Code ist dem udacity Kurs CS212 entnommen, dessen Foren leider ziemlich inaktiv sind(Kurs bereits lange vorbei):
http://pastebin.com/j2DMg7Qi

Hier meine Vorarbeit:

Code: Alles auswählen

a = plus(lit("a"))
a = plus( lambda Ns: set([s]) if len(s) in Ns else null)
a = lambda Ns: genseq(lambda Ns: set([s]) if len(s) in Ns else null,
star(lambda Ns: set([s]) if len(s) in Ns else Null),
Ns,
1
) 
Wird star(..) hier direkt ausgewertet? Ich bin nicht davon ausgegangen.

Code: Alles auswählen

a([4])
Den body der lambda Funktion mit [4] als Ns ausfüllen.

Code: Alles auswählen

genseq(lambda Ns: set([s]) if len(s) in Ns else null,
lambda Ns: opt(plus(lambda Ns: set([s]) if len(s) in Ns else null,
4,
1)
star(x) gemäs seiner Definition mit opt(plus(x)) ersetzt.
Nun wird doch wieder plus mit dem exakt gleichen Funktionsargument aufgerufen wie weiter oben. Es soll eine Funktion
zurückgegeben werden, die eine Funktion aufruft, die star(x) als Argument hat. Dieses wird wiederum plus(x) aufrufen.
Warum gibt es keine Endlosschleife?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hilft dir das weiter:

Code: Alles auswählen

import traceback

...

def genseq(x, y, Ns, startx=0):
    if not Ns:
        for line in traceback.format_stack():
            print line
        
        return null

    ...
?
Das Leben ist wie ein Tennisball.
derrick
User
Beiträge: 34
Registriert: Mittwoch 8. Juni 2011, 20:32

Hey,
konnte mich leider nicht früher melden.
Zum Thema:
Danke dir, sehr hilfreiches Modul. Konnte den Verlauf nachvollziehen.
Diese Art der Rekursion mit Funktionen die Funktionen zurückgeben usw.
ist allerdings auf Anhieb kaum zu durchschauen. Ich nehme an man braucht
einfach eine große Erfahrung bevor man selbst sowas entwirft.
BlackJack

@derrick: Wer Erfahrung hat entwirft so etwas nicht. ;-)
Antworten