Вы ожидаете, что хвостовая рекурсивная версия будет быстрее из-за оптимизации хвостового вызова, и я думаю, что это правильно, если вы сравните яблоки с яблоками:
def split3(s: String, c: Char): Seq[String] = {
@tailrec def recurse(i: Int, acc: List[String] = Nil): Seq[String] = {
val p = s indexOf (c, i)
if (p < 0) {
s.substring(i) :: acc
} else {
recurse(p + 1, s.substring(i, p) :: acc)
}
}
recurse(0) // would need to reverse
}
Я рассчитал, что split3
будет быстрее, за исключением, конечно, чтобы получить тот же результат, он должен был бы обратить вспять результат.
Кажется, ListBuffer
вносит недостатки, которые не может компенсировать оптимизация хвостовой рекурсии.
Редактировать: думать о том, чтобы избежать обратного ...
def split3(s: String, c: Char): Seq[String] = {
@tailrec def recurse(i: Int, acc: List[String] = Nil): Seq[String] = {
val p = s lastIndexOf (c, i)
if (p < 0) {
s.substring(0, i + 1) :: acc
} else {
recurse(p - 1, s.substring(p + 1, i + 1) :: acc)
}
}
recurse(s.length - 1)
}
Это имеет оптимизацию хвостового вызова и позволяет избежать ListBuffer
.