2013-05-06 167 views
5

所以我明白,按需呼叫只不过是按名称的备忘录版本。在Martin Odersky关于Coursera的FP课程中,他在第7.3课(懒惰评估)中提到,如果Streams是使用call-by-name实现的,那么它可能会导致计算复杂度的爆炸。斯卡拉流按需呼叫(懒惰)vs按名称呼叫

这是什么样的爆炸?

的call-by-名称:

def cons[T](hd: T, tl: => Stream[T]) = new Stream[T] { 
    def head = hd 
    def tail = tl 
    ... 
} 

的call-by-需求:

def cons[T](hd: T, tl: => Stream[T]) = new Stream[T] { 
    def head = hd 
    lazy val tail = tl 
    ... 
} 

回答

2

例如斐波纳契数列,通过将前两个元素形成的继任者来实现。无记忆化,这将在该序列的长度的线性减速(和堆栈增长):

scala> lazy val fib: Stream[Int] = Stream.cons(0, 
    | Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2))) 
fib: Stream[Int] = Stream(0, ?) 

例懒惰地(-sic-)从this blog

+0

复制请检查链接, – sailor 2018-01-28 02:06:55

+0

@sailor - 感谢,更正 – 2018-02-07 19:14:42