Als Scala Neuling, lese ich Bücher, Dokumente und versuchen, Probleme zu lösen gefunden auf http://aperiodic.net/phil/scala/s-99/. Es scheint korrekt zu sein, dass Scala-Code auf unveränderlichen Werten (val) und auf Rekursion basiert und nicht auf Schleifen und Variablen, um die Parallelität sicherer zu machen und die Notwendigkeit zu vermeiden, Sperren zu verwenden.Scala Neuling: Rekursion und stackoverflow Fehler
Zum Beispiel kann eine mögliche Lösung für die Ausübung P22 (http://aperiodic.net/phil/scala/s-99/p22.scala) ist:
// Recursive.
def rangeRecursive(start: Int, end: Int): List[Int] =
if (end < start) Nil
else start :: rangeRecursive(start + 1, end)
Natürlich ist dieser Code kompakt und sieht smart, aber natürlich, wenn die Anzahl der Rekursion hoch ist, werden Sie einen StackOverflow-Fehler (RangeRecorssive (1.10000) zum Beispiel ohne JVM-Tuning). Wenn Sie sich die Quelle des eingebauten List.range ansehen (https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/immutable/List.scala#L1), dann werden Sie Ich sehe, dass Loops und Vars verwendet werden.
Meine Frage ist, wie man den Einfluss des Scala-Lernens, das Vals und Rekursion fördert, in der Kenntnis, dass solcher Code aufgrund der Anzahl der Rekursion brechen kann, verwaltet?
Scala-Compiler ist schlau genug, um tail-rekursive Aufrufe in [trampooledined] kompiliert zu machen (Tail Recursion) (JVM.Trugdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html) unterstützt nicht TCE), die nicht zum stackoveflow führen. Wenn Sie sicher sein wollen, dass Ihr Code tail rekursiv ist, fügen Sie @tailrec Annotation zur Methodensignatur hinzu. –