Использование рекурсии в Scala при запуске в JVM

При поиске в другом месте на этом сайте и в Интернете оптимизация хвостового вызова не поддерживается 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 требуется только для повторного использования кадра стека ди- функция с прямой хвостовой рекурсией, последним действием которой является вызов самой себя. Другие хвостовые крики могут также можно оптимизировать, но не следует полагаться на это в разных реализациях.

Кто-нибудь может объяснить, что означают два средних предложения этого абзаца?

Спасибо!

11
задан gw111zz 17 April 2011 в 20:21
поделиться