Seite 1 von 1

2 Funktionen rufen einander auf, dennoch keine Schleife?!

Verfasst: Sonntag 9. Juni 2013, 21:21
von derrick
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?

Re: 2 Funktionen rufen einander auf, dennoch keine Schleife?

Verfasst: Sonntag 9. Juni 2013, 21:50
von EyDu
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

    ...
?

Re: 2 Funktionen rufen einander auf, dennoch keine Schleife?

Verfasst: Dienstag 11. Juni 2013, 15:38
von derrick
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.

Re: 2 Funktionen rufen einander auf, dennoch keine Schleife?

Verfasst: Dienstag 11. Juni 2013, 15:43
von BlackJack
@derrick: Wer Erfahrung hat entwirft so etwas nicht. ;-)