Это продолжение моего предыдущего вопроса .
Как я понимаю , следующий метод вычисления чисел Фибоначчи неэффективен, поскольку метод fib
вызывается для каждого числа Фибоначчи, и каждый раз, когда он вызывается, он создает новый поток.
def fib:Stream[Int] = Stream.cons(1, Stream.cons(1, (fib zip fib.tail) map {case (x, y) => x + y}))
С другой стороны, хвостовой рекурсивный метод (как в здесь ) выглядит достаточно эффективным и вычисляет каждое число Фибоначчи в O (1)
def fib(a:Int, b:Int):Stream[Int] = Stream.cons(a, fib(b, a+b));
Теперь я делаю вывод что рекурсивные методы, создающие потоки, эффективны тогда и только тогда, когда они являются хвостовыми рекурсивными. Это правильно?