Als ich anfing, Lisp zu lernen, bin ich auf den Begriff Schwanzrekursiv gestoßen . Was bedeutet es
Die Schwanzrekursion ist eine rekursive Strategie, bei der eine Funktion einige Arbeit erledigt und sich dann selbst aufruft. Der "Schwanz" bezieht sich auf die Tatsache, dass die Rekursion ganz am Ende der Funktion steht. Viele - insbesondere funktionale - Programmiersprachen-Compiler können diese Arten von Aufrufen in Iteration umwandeln, was bedeutet, dass die Schwanzrekursion in unterstützten Sprachen unabhängig von der Anzahl der Aufrufe ohne Angst vor einem Stapelüberlauf verwendet werden kann.
Als ich anfing, Lisp zu lernen, bin ich auf den Begriff Schwanzrekursiv gestoßen . Was bedeutet es
Was ist Tail-Call-Optimierung? Genauer gesagt, was sind einige kleine Codefragmente, wo sie angewendet werden könnten und wo nicht, mit einer Erklärung,
Wie breche ich eine Schleife aus? var largest=0 for(i<-999 to 1 by -1) { for (j<-i to 1 by -1) { val product=i*j if (largest>product) // I want to break out here else if(product.toString.equals(product.toString.reverse)) largest=largest max product } } Wie verwandle ich verschachtelte...
Diese Frage passt derzeit nicht zu unserem Q & A-Format. Wir erwarten, dass die Antworten durch Fakten, Referenzen oder Fachwissen gestützt werden, aber diese Frage wird wahrscheinlich zu Debatten, Argumenten, Umfragen oder erweiterten Diskussionen führen. Wenn Sie der Meinung...
Ich habe den folgenden Code, der mit dem folgenden Fehler fehlschlägt: RuntimeError: Maximale Rekursionstiefe überschritten Ich habe versucht, dies neu zu schreiben, um die Optimierung der Schwanzrekursion (TCO) zu ermöglichen. Ich glaube, dass dieser Code erfolgreich gewesen sein sollte, wenn...
Es scheint mir, dass es perfekt funktionieren würde, eine Tail-Rekursionsoptimierung sowohl in C als auch in C ++ durchzuführen, aber beim Debuggen sehe ich nie einen Frame-Stack, der diese Optimierung anzeigt. Das ist irgendwie gut, denn der Stapel sagt mir, wie tief die Rekursion ist. Die...
Ich verstehe fast, wie die Schwanzrekursion funktioniert und welchen Unterschied sie zu einer normalen Rekursion hat. Ich verstehe nur nicht, warum es keinen Stapel erfordert, um sich seine Absenderadresse zu merken. // tail recursion int fac_times (int n, int acc) { if (n == 0) return acc; else...
Ich fand diese Frage, welche Sprachen die Schwanzrekursion optimieren. Warum optimiert C # die Schwanzrekursion nicht, wann immer dies möglich ist? Warum wird diese Methode für einen konkreten Fall nicht in einer Schleife optimiert ( Visual Studio 2008 32-Bit, wenn dies wichtig ist)?: private...
Ich habe dieses Zitat auf der Frage gesehen: Was ist eine gute funktionale Sprache, auf der ein Webdienst aufgebaut werden kann? Insbesondere Scala unterstützt die Eliminierung von Tail-Calls nur in selbstrekursiven Funktionen, wodurch die Art der Komposition eingeschränkt wird (dies ist eine...
Funktionale Sprachen führen zur Verwendung von Rekursion, um viele Probleme zu lösen, und daher führen viele von ihnen eine Tail Call Optimization (TCO) durch. TCO bewirkt, dass Aufrufe einer Funktion von einer anderen Funktion (oder von sich selbst. In diesem Fall wird diese Funktion auch als Tail...
Ich habe einen rekursiven Pfadfindungsalgorithmus, den ich in JavaScript implementiert habe, und möchte wissen, ob (alle?) Browser möglicherweise Ausnahmen für Stapelüberläufe
Ich habe heute den Befehl "time" unter Unix entdeckt und dachte, ich würde ihn verwenden, um den Unterschied in den Laufzeiten zwischen tail-rekursiven und normalen rekursiven Funktionen in Haskell zu überprüfen. Ich habe folgende Funktionen geschrieben: --tail recursive fac :: (Integral a) =>...
Ich habe versucht herauszufinden, wie Tail-Aufrufe vom C # -Compiler verarbeitet werden. (Antwort: Sie sind es nicht. Aber die 64-Bit- JITs werden TCE (Tail Call Elimination) ausführen. Es gelten Einschränkungen .) Also habe ich einen kleinen Test mit einem rekursiven Aufruf geschrieben, der...
Ich wollte foldl vs foldr testen. Nach allem, was ich gesehen habe, sollten Sie aufgrund der Optimierung der Schwanzrekursion Foldl über Foldr verwenden, wann immer Sie können. Das macht Sinn. Nach dem Ausführen dieses Tests bin ich jedoch verwirrt: foldr (dauert 0,057 Sekunden, wenn der...
Ich habe versucht zu verstehen Tail call optimization im Kontext von JavaScript und habe die folgenden rekursiven und schwanzrekursiven Methoden für geschrieben factorial(). Rekursiv: function factorial (n) { if (n < 2) { return 1; } else { return n * factorial(n-1); } } Schwanzrekursiv:...
Hier ist ein Teil des Codes aus der Dokumentation für fs2 . Die Funktion goist rekursiv. Die Frage ist, woher wissen wir, ob es stapelsicher ist und wie man begründet, ob eine Funktion stapelsicher ist? import fs2._ // import fs2._ def tk[F[_],O](n: Long): Pipe[F,O,O] = { def go(s: Stream[F,O],...
C Sprache In der Programmiersprache C ist es einfach, eine Schwanzrekursion durchzuführen : int foo(...) { return foo(...); } Geben Sie einfach den Rückgabewert des rekursiven Aufrufs zurück. Es ist besonders wichtig, wenn sich diese Rekursion tausend- oder sogar millionenfach wiederholen kann. Es...