2013-05-06 9 views
5

私は、コールバイニーズは単純に呼び名のメモ付きバージョンであることを理解しています。講義7.3(遅延評価)のCourseraのMartin OderskyのFPコースでは、Streamsがコール・バイ・ネームを使用して実装されていれば、計算上の複雑さが爆発する可能性があると述べています。スカラストリームcall-by-need(怠惰な)vs名前による呼出し

このような爆発の例は何でしょうか?

コールバイ名:

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

コールバイ必要:

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

答えて

2

例えばフィボナッチ数列、後継を形成する前の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

+0

@sailor:メモ化がなければ、それはシーケンスの長さの直線的な減速(およびスタックの成長を)持っています、修正済み –

関連する問題