Это определенно не хвостовая рекурсия.f(sublist) :::
изменяет результаты рекурсивного вызова, превращая его в простую рекурсию с перебором стека вместо хвостовой рекурсии.
Один из способов убедиться, что ваши функции являются хвостовой рекурсией, - это поместить@annotation.tailrec
для любой функции, для которой вы ожидаете получить хвостовую рекурсию.Компилятор сообщит об ошибке, если не выполнит оптимизацию хвостового вызова.
Для этого я бы добавил небольшую вспомогательную функцию, которая на самом деле является хвостовой рекурсией:
def flatMapSublistsTR[A,B](ls: List[A])(f: (List[A]) => List[B]): List[B] = {
@annotation.tailrec
def helper(r: List[B], ls: List[A]): List[B] = {
ls match {
case Nil => r
case sublist@(_ :: tail) => helper(r ::: f(sublist), tail)
}
}
helper(Nil, ls)
}
ДляПричины, не сразу очевидные для меня, результаты выходят в другом порядке, чем исходная функция.Но, похоже, это работает: -) Исправлено.