При поиске в другом месте на этом сайте и в Интернете оптимизация хвостового вызова не поддерживается 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 by Example Мартина Одерски содержит следующий параграф, который кажется to предполагает, что существуют обстоятельства или другие среды, в которых уместна рекурсия:
В принципе, хвостовые вызовы всегда могут повторно использовать кадр стека вызывающего функция. Однако в некоторых средах выполнения (например, в Java VM) отсутствует примитивы для эффективного повторного использования кадра стека для хвостовых вызовов. Качество продукции Поэтому реализация Scala требуется только для повторного использования кадра стека ди- функция с прямой хвостовой рекурсией, последним действием которой является вызов самой себя. Другие хвостовые крики могут также можно оптимизировать, но не следует полагаться на это в разных реализациях.
Кто-нибудь может объяснить, что означают два средних предложения этого абзаца?
Спасибо!