Ich versuche, rekursive Funktionen zu lernen, aber ich kann meinen Kopf nicht darum herumschlingen

8

Ich versuche zu lernen, rekursive Funktionen zu verwenden, verstehe aber nicht, was überhaupt passiert.

%Vor%

Ich bekomme:

  

RangeError: Maximale Call-Stack-Größe überschritten.

Aus dem Beispiel, aus dem ich gehe, heißt es:

%Vor%

Könnte mir jemand erklären, warum die if-Anweisung benötigt wird? Ich vermute, dass mir etwas fehlt.

    
Dan 13.09.2011, 19:34
quelle

7 Antworten

8

Eine rekursive Funktion ruft sich selbst auf. Das ist die Definition davon.

Das bringt ein Problem mit sich: es wird sich unbegrenzt selbst nennen. So wird es für immer gehen, weshalb Sie Stapelüberläufe bekommen.

Stattdessen sollten Sie an einem bestimmten Punkt anhalten. Hier kommt die if -Klausel ins Spiel. Wenn exponent == 0 , rufen Sie die Funktion nicht auf, sondern stoppen den Prozess.

Wenn Sie also power(3, 3) ausführen, wird es wie folgt aussehen:

%Vor%

Aus einem etwas anderen Blickwinkel betrachtet:

  • power(4, 4) ist als 4 * power(4, 3) durch die Funktion definiert.
  • power(4, 3) ist als 4 * power(4, 2) durch die Funktion definiert.
  • power(4, 2) ist als 4 * power(4, 1) durch die Funktion definiert.
  • power(4, 1) ist als 4 * power(4, 0) durch die Funktion definiert.
  • power(4, 0) ist als 1 durch die Funktion definiert.

Wenn Sie alle vorherigen Elemente ersetzen, erhalten Sie:

%Vor%     
pimvdb 13.09.2011, 19:37
quelle
5

Sie benötigen einen Basisfall in der Rekursion, damit er nicht mehr selbst aufruft. In diesem Fall wird die Potenzfunktion für immer aufgerufen (bis der Javascript-Interpreter aufgibt), da der Exponent in die negative Unendlichkeit geht.

    
spike 13.09.2011 19:36
quelle
3

Eine rekursive Funktion ruft sich selbst auf. Du brauchst also einen Mechanismus, um zu sagen, dass er aufhören soll oder du wirst in einer Endlosschleife sein. In Ihrem Fall kehren Sie immer zurück und bieten keine Möglichkeit, die Schleife zu verlassen. Daher der RangeError.

    
mrtsherman 13.09.2011 19:36
quelle
3

Beachten Sie, dass die Funktion sich selbst aufruft. In Ihrem ersten Beispiel ruft die Funktion sich selbst auf, und dann ruft die neu aufgerufene Funktion selbst auf und so weiter. Intern speichert Ihr Computer diese Funktionsaufrufe in einer Speicherstruktur, die als Stack bezeichnet wird. Wenn es keinen Speicher mehr für das Speichern von Funktionsaufrufen gibt, haben Sie die Größe des Aufrufstapels überschritten.

Im zweiten Beispiel haben Sie eine Möglichkeit, diesem Teufelskreis zu entkommen. Im Basisfall wird die Funktion zurückgegeben und Sie können die Methodenaufrufe vom Stapel entfernen.

Beachten Sie, dass Sie in Ihrem zweiten Beispiel mit alert (power (4, -1)) beginnen können und das gleiche Problem erneut auftreten wird, weil Ihre Funktion jetzt eins von -1 subtrahiert und Sie -2 und bald. Sie können den Code mit

verstärken %Vor%

... stattdessen.

    
Steni 13.09.2011 19:42
quelle
2

Rekursion ruft die Funktion tatsächlich innerhalb ihres eigenen Funktionskörpers wieder auf & amp; wieder, bis Sie das gewünschte Ergebnis erhalten.

%Vor%

Was passiert, dass Rekursion stack verwendet?

Angenommen, k = 1, gibt 1 zurück.

Wenn k = 4 ist, geht die Steuerung zu else, kehrt zurück (4 * FactorialOfNumber (3)). Da Sie nicht wissen, FactorialOfNumber (3). Es speichert an der Spitze des Stapels.

jetzt, k = 3, Kontrolle geht zu sonst, es gibt zurück (3 * FactorialOfNumber (2)). nw das geht an den Anfang des Stapels.

jetzt k = 2, gibt (2 * FactorialOfNumber (1)), Anfang des Stapels zurück.

Schließlich heißt es, dass Pops aus dem Stapel, schließlich (4 * FactorialOfNumber (3)) aufgerufen wird.

Wenn eine rekursive Methode niemals einen Basisfall erreicht, wird der Stapel niemals aufhören zu wachsen. Der Computer begrenzt jedoch den Stapel auf eine bestimmte Höhe, so dass kein Programm zu viel Speicherplatz verbraucht. Wenn der Stack eines Programms diese Größe überschreitet, löst der Computer eine Ausnahme aus, die das Programm normalerweise zum Absturz bringen würde. Die Ausnahme wird als StackOverflowError bezeichnet.

    
RoNNie 13.09.2011 19:54
quelle
1

Sie müssen ihm einige Eckbedingungen geben, sonst wird er sich immer wieder selbst anrufen. Da die Stackgröße begrenzt ist, wird das Ende des Stackspeichers erreicht, und dann wird ein Fehler ausgelöst.

    
mateusz.fiolka 13.09.2011 19:37
quelle
1

Das if erzeugt eine Überprüfung, um die Rekursion zu stoppen, wenn der Exponent Null erreicht. Ohne es wird es mit negativen Werten fortfahren und nie aufhören.

    
Majid Fouladpour 13.09.2011 19:39
quelle

Tags und Links