http://www.debian-administration.org/articles/34
я записал, что несколько лет назад, но это - все еще хорошее введение, которое получает много позитивных откликов.
Методы, которые можно переопределить, НЕ могут быть хвостовыми рекурсивными. Попробуйте следующее:
class Foo {
private def ifak(n: Int, acc: Int): Int = {
if (n == 1) acc
else ifak(n-1, n*acc)
}
}
Попробуйте следующее:
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
может быть рекурсивным, но может и не так. Отметьте класс или метод как окончательные, и он, вероятно, должен стать хвостовым рекурсивным.