Habe ich die Rekursion korrekt verwendet?

8

Ich arbeite einige JavaScript-Probleme und löste ein Problem mit Rekursion. Obwohl ich es richtig verstanden habe, unterscheidet sich meine Implementierung von der "offiziellen" Lösung, also habe ich mich gefragt, ob irgendjemand einen Einblick hatte, ob die offizielle Antwort besser ist und wenn ja, warum.

Frage

  

Implementieren Sie eine Funktion, die eine Funktion als erstes Argument verwendet, eine Zahl num als zweites Argument und führt dann die übergebene Funktion num mal aus.
  Es ist in Ordnung, eine Schleife in Ihrer Implementierung zu verwenden, Bonuspunkte, wenn Sie stattdessen Rekursion verwenden.

Meine Lösung

%Vor%

Gegebene Lösung

%Vor%

Gibt es irgendetwas an der gegebenen Lösung, das es besser macht als meine?

    
Juan Vazquez 28.11.2015, 21:50
quelle

3 Antworten

5

Es gibt einen bestimmten Grund, das Ergebnis eines rekursiven Aufrufs direkt zurückzugeben. Dies wird "Tail-Rekursion" genannt, und eine clevere Laufzeitumgebung kann für diesen Fall optimieren und ausführen, ohne zusätzlichen Stapelspeicherplatz für die rekursiven Aufrufe zu verwenden (es verwendet einfach den Stapelspeicherbereich der aktuellen Funktion). In der neuesten ECMAScipt 6-Spezifikation (Javascript für Sie und mich) wird ausdrücklich darauf hingewiesen, dass die Laufzeitumgebung tail-rekursive Aufrufe optimieren soll.

In der Praxis tut Ihr Code tatsächlich nichts nach dem rekursiven Aufruf, also ist er richtig tail-rekursiv. Wenn Sie den rekursiven Aufruf mit einer return-Anweisung ausführen, wird deutlich, dass es sich um einen rekursiven Tail-Aufruf handeln sollte, und ein bisschen wahrscheinlicher ist, dass die Laufzeitumgebung ihn korrekt optimiert.

    
N. Leavy 28.11.2015, 22:12
quelle
5

Bedenke einfach im Kopf. Es gibt etwas, was jeder JavaScript-Entwickler wissen muss. Wenn die Rekursion sehr lange dauert, kann der Browser Ihr Skript beenden oder dem Benutzer einen Fehler melden. Oft verwenden JavaScript-Entwickler solche Ansätze:

%Vor%

Auf diese Weise werden Sie den Langzeitbetrieb an kleinen Teilen unterbrechen.

    
Georgi Naumov 28.11.2015 22:08
quelle
4

Die Lösungen sind identisch, aber in der Praxis ist die gegebene Lösung leichter zu verstehen. Es gibt einen eindeutigen "Basisfall", und die Rekursion wird in der return -Anweisung durchgeführt. Beide Eigenschaften führen zu besserer Codequalität und Lesbarkeit bei rekursiven Funktionen.

    
Tennyson H 28.11.2015 21:54
quelle

Tags und Links