rekursive Funktionen Generell
-
Hallo,
Pseudo-Code einer rekursiven Funktion fu():
fu(){ // Anfang der Folge if(...){ ... } // Rekursionsformel fu()... } // Ende der Definition von fu()Folgende Frage habe ich dazu:
Wie kann sich eine Funktion selbst aufrufen? Wenn sich die Funktion fu() aufruft (im Abschnitt der Rekursionformel), dann ist fu() ja noch gar nicht fertig deklariert, d.h. der Compiler weiss gar nicht was fu() bedeutet.Folgendes habe ich mir zusammengegoogelt:
Die Funktionen sind in einem speziellen Ort abgespeichtert, dem Programmspeicher. Darum sind alle Funktionen immer definiert.Ist dies so richtig?
Danke für alle Antworten
Istvan
-
Istvan schrieb:
Folgendes habe ich mir zusammengegoogelt:
Die Funktionen sind in einem speziellen Ort abgespeichtert, dem Programmspeicher. Darum sind alle Funktionen immer definiert.Jo, zur Laufzeit eh. Da sind alle fertig.
Istvan schrieb:
Wie kann sich eine Funktion selbst aufrufen? Wenn sich die Funktion fu() aufruft (im Abschnitt der Rekursionformel), dann ist fu() ja noch gar nicht fertig deklariert, d.h. der Compiler weiss gar nicht was fu() bedeutet.
Das wäre die Frage, wie er es compilieren kann. Es geht auch. Er weiß schon, daß es eine Funkltion fu gibt, denn er hat den Funktionskopf schon gelesen und angefangen, die Funktion zu schreiben. Er muss für das Generieren des Codes für den Aufruf nicht wissen, was in fu drinsteht, sondern nur, wo fu im Speicher stehen wird.
-
Istvan schrieb:
d.h. der Compiler weiss gar nicht was fu() bedeutet.
Was fu() genau bedeutet, ist dem Compiler egal. Er "akzeptiert" einen Funktionsaufruf, wenn er weiß, dass es irgendwo eine Funktion mit diesem Namen gibt. Dabei würde ihm eine Deklaration bereits genügen.
Der tatsächliche Aufruf findet erst zur Laufzeit statt.
-
Eine Funktion kannst du nicht aufrufen, wenn sie nicht deklariert ist. Deklarieren bedeutet ja einfach nur bekannt machen. Und das ist in deinem Beispiel doch der Fall, du schreibst dochfu(). Vergiss nicht, dass für die Bekanntmachung nur der Funktionskopf ausschlaggebend ist, der Funktionsrumpf interessiert nicht.