Wann soll eine reine Rekursion verwendet werden und wann wird loop / recur verwendet?

8

"pure Rekursion" ist hier ein Begriff, bitte vergib.

Hier sind zwei Beispiele, die zwei verschiedene Rekursionsansätze verwenden. Was sind die Richtlinien für die Verwendung von einem über den anderen?

%Vor%     
Yuriy Zubarev 11.01.2013, 05:57
quelle

3 Antworten

9

Ein paar Faktoren zu beachten:

  • loop / recur verbraucht keinen Stack-Platz - also ist es die richtige Wahl, wenn Sie tief verschachtelte Rekursionen durchführen wollen, die sonst eine StackOverflowError verursachen könnten.
  • loop / recur ist schneller - es ist eines der effizientesten Konstrukte in Clojure, korrekt ausgeführt sollte es mit der Geschwindigkeit eines äquivalenten für loop im Java-Code
  • übereinstimmen
  • normale Rekursion ist idiomatischer - im Durchschnitt tendiert sie dazu, Ihnen einen klareren, funktionaleren Code zu geben, während loop / recurve dazu tendiert, Sie mehr in Richtung eines imperativen, iterativen Stils zu treiben
  • loop / recur hat mehr Einschränkungen - Sie können nur in der Endposition rekursiv sein, Sie können keine gegenseitige Rekursion zwischen zwei verschiedenen Funktionen usw. durchführen. Manchmal ist es einfach nicht möglich, Schleifen- / Recurve-Arbeiten durchzuführen. zu anderen Zeiten müssen Sie möglicherweise Ihren Code dazu verschieben.
mikera 11.01.2013, 06:04
quelle
2

Der einzige Grund, den lazy-seq / lazy-cons -Mechanismus zu verwenden, ist das Erzeugen von Lazy-Sequenzen. Wenn Sie sie nicht brauchen, sollte loop / recur zweifellos verwendet werden.

    
mobyte 11.01.2013 07:23
quelle
1

Verwenden Sie einfache Rekursion, wenn Sie Ihre Funktion an erster Stelle schreiben. Dann ändern Sie dies, um zu wiederholen, sobald Sie alles funktioniert haben, wenn Sie können.

Ein Problem mit TCO ist, dass wenn Sie Ihre Rekursion ablehnen, Sie ein unendliches Aussehen bekommen. Ohne, stürzt Ihr Code gut mit einem Stack-Überlauf ab, was Sie wollen. Ich mochte die Idee des Rezidivs nicht, als ich das erste Mal davon hörte - die meisten Optimierungen sollten einfach passieren - aber es ist nett, es ausschalten zu können.

    
Phil Lord 11.01.2013 10:16
quelle

Tags und Links