От поиска в другом месте на этом сайте и в Интернете оптимизация хвостовых вызовов не поддерживается JVM. Означает ли это, что хвостовой рекурсивный Scala код, такой как следующий, который может работать на очень больших входных списках, не должен быть записан, если он должен запускаться на JVM?
// Get the nth element in a list
def nth[T](n : Int, list : List[T]) : T = list match {
case Nil => throw new IllegalArgumentException
case _ if n == 0 => throw new IllegalArgumentException
case _ :: tail if n == 1 => list.head
case _ :: tail => nth(n - 1, tail)
}
Мартин Одерски Scala по примеру содержит следующий параграф, который, как представляется, указывает на наличие обстоятельств или других сред, где рекурсия подходит:
В принципе, хвостовые вызовы всегда могут повторно использовать фрейм стека вызова функция. Однако некоторые среды выполнения (например, виртуальная машина Java) не имеют примитивы, чтобы сделать повторное использование фреймов стека для эффективного использования хвостовых вызовов. Качество продукции Таким образом, реализация Scala необходима только для повторного использования кадра стека di- прямая хвосто-рекурсивная функция, последним действием которой является вызов самому себе. Другие хвостовые звонки могут также оптимизироваться, но не следует полагаться на это во всех реализациях.
Может ли кто-нибудь объяснить, что означают эти средние два предложения этого абзаца?
Спасибо!