Рекурсивные методы для создания потоков в Scala

Это продолжение моего предыдущего вопроса .

Как я понимаю , следующий метод вычисления чисел Фибоначчи неэффективен, поскольку метод 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));

Теперь я делаю вывод что рекурсивные методы, создающие потоки, эффективны тогда и только тогда, когда они являются хвостовыми рекурсивными. Это правильно?

5
задан Community 23 May 2017 в 12:26
поделиться