Я написал такую функцию на Scala:
def isSorted[T](list : List[T])(compare : (T, T) => Boolean) : Boolean = {
list match {
case Nil => true
case x :: Nil => true
case x :: rest => !compare(rest.head, x) && isSorted(rest)(compare)
}
}
Мне любопытно, оптимизирует ли компилятор рекурсивный вызов. Рекурсивный вызов может только произойти, если ведущее сравнение завершится успешно. Если нет, есть ли способ выйти из строя на раннем этапе и при этом добиться оптимизации хвостовой рекурсии?
@tailrec
не делает метод хвостовой рекурсивным волшебным образом, он делает ошибку, если он не является хвостовой рекурсией. - person Randall Schulz   schedule 19.03.2013