Почему это не хвостовая рекурсия? - PullRequest
3 голосов
/ 13 февраля 2020

У меня есть следующий код, который я не понимаю, почему это не хвостовая рекурсия:

override fun drop(n: Int): List<A> = if (n == 0) this else tail.drop(n - 1)

, тогда как это хвостовая рекурсия:

fun drop(n: Int): List<A> {
  tailrec fun drop(n: Int, list: List<A>): List<A> =
    if (n <= 0) list else when (list) {
      is Cons -> drop(n - 1, list.tail)
      is Nil -> list
    }
  return drop(n, this)
}

Почему первый пример не хвостовая рекурсия?

1 Ответ

3 голосов
/ 13 февраля 2020

Это не хвостовая рекурсия, потому что Kotlin проверяет, что рекурсивный вызов находится на том же приемнике. В твоем случае это правильно; drop - это виртуальная функция (поскольку вы используете override), поэтому tail.drop может иметь другую реализацию. Для не open функций существует проблема Tailre c оптимизация, не применяемая к хвостовым рекурсивным вызовам на не-этом приемнике , но, похоже, она активно не обрабатывается.

Обратите внимание также на эту ошибку: Рекурсивные вызовы для открытия tailre * c функции генерируются неправильно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...