Почему не может scalac оптимизировать хвостовую рекурсию в определенных сценариях?

http://www.debian-administration.org/articles/34

я записал, что несколько лет назад, но это - все еще хорошее введение, которое получает много позитивных откликов.

8
задан skaffman 27 November 2011 в 15:27
поделиться

3 ответа

Методы, которые можно переопределить, НЕ могут быть хвостовыми рекурсивными. Попробуйте следующее:

class Foo {
  private def ifak(n: Int, acc: Int): Int = {  
    if (n == 1) acc  
    else ifak(n-1, n*acc)  
  }
}
12
ответ дан 5 December 2019 в 12:59
поделиться

Попробуйте следующее:

class Foo {
  def ifak(n: Int, acc: Int):Int = {
    if (n == 1) acc
    else ifak(n-1, n*acc)
  }
}

class Bar extends Foo {
  override def ifak(n: Int, acc: Int): Int = {
    println("Bar!")
    super.ifak(n, acc)
  }
}

val foobar = new Bar
foobar.ifak(5, 1)

Обратите внимание, что ifak может быть рекурсивным, но может и не так. Отметьте класс или метод как окончательные, и он, вероятно, должен стать хвостовым рекурсивным.

1
ответ дан 5 December 2019 в 12:59
поделиться

Внутренние функции также соответствуют TCO.

0
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: