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.
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:
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%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.
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.
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.
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.
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.
Tags und Links javascript recursion