【发布时间】:2012-02-01 13:59:27
【问题描述】:
这是my previous question的后续行动。
正如我understand 一样,以下计算斐波那契数的方法效率低下,因为每个斐波那契数都会调用 fib 方法,并且每次调用它都会创建一个新流。
def fib:Stream[Int] =
Stream.cons(1, Stream.cons(1, (fib zip fib.tail) map {case (x, y) => x + y}))
另一方面,尾递归方法(如here)看起来非常有效,并计算O(1)中的每个斐波那契数
def fib(a:Int, b:Int):Stream[Int] = Stream.cons(a, fib(b, a+b));
现在我得出结论,创建 Streams 的递归方法是有效的当且仅当它们是尾递归的。对吗?
【问题讨论】:
-
这两个例子都不是尾递归的。
-
@DanielC.Sobral 你能解释一下为什么第二个实现在
O(1)中计算每个斐波那契数,但第一个在O(N)中计算 -
哎呀对不起...我说的是第一个...让我删除我的评论...
-
安迪已经回答了这个问题,但我会尝试举一个更具说明性的例子。