В дополнение к ответам выше, если вы используете foldLeft, он уже оптимизирован для хвостового вызова
def Sphere(list: List[Double]): Double = {
list.foldLeft(0.0)((res, elem) => res + elem * elem)
}
Лучше использовать версии библиотеки и не добавлять дополнительную проверку (@tailrec) для компилятора, когда материал доступен.
** foldLeft аналогичен ReduLeft, за исключением того, что он принимает дополнительное начальное значение в качестве аргумента и не выдает исключение, когда коллекция пуста.
** Реальная реализация foldLeft заканчивается использованием whileцикл по соображениям производительности, но опять же, это преимущество хвостовой рекурсии, сделайте его таким же быстрым, как цикл.