Хотя сама реализация нуждается в огромных улучшениях, и я надеюсь, что это произойдет, когда вы улучшите ее с Scala. Я буду предполагать, что все остальное идеально, и просто сконцентрируюсь на преобразовании из хвостовой рекурсии.
Чтобы преобразовать хвостовой рекурсивный код в l oop, вам просто нужно захватить условие завершения рекурсии и сделать это условие завершения l oop,
def sortingHelper2(segments: List[(Int, Int)]): Unit = {
var newSegments = segments
while (newSegments.nonEmpty) {
val (l, r) = newSegments.head
newSegments = newSegments.tail
sortRange(l, r) match {
case (i, j) =>
if (l < j) {
newSegments = (l, j) :: newSegments
}
if (i < r) {
newSegments = (i, r) :: newSegments
}
}
}
}
Чтобы лучше объяснить, давайте рассмотрим одну из простейших хвостовых рекурсивных функций,
def sumUpToN(n: Int): Long = {
@tailrec
def _sumUpToN(acc: Long, m: Int): Long = {
if (m > 0)
_sumUpToN(acc + m, m - 1)
else
acc
}
_sumUpToN(0, n)
}
Чтобы преобразовать ее в al oop на основе одного, вам просто нужно переместить это условие завершения / продолжения в ваше время l oop,
def sumUpToN(n: Int): Long = {
var acc = 0
var m = n
while (m > 0) {
acc = acc + m
m = m - 1
}
acc
}