2011-12-22 9 views
2

私は再帰的に定義されたStreamを持っているとします。スカラストリームとそれらのスタックメモリ使用

def from(n:Int):Stream[Int] = Stream.cons(n, from(n+1))

私は定数スタックメモリが必要だと思います。それが正しいか?再帰的に定義されたstreamについては正しいですか?定数でないスタックメモリを使用する再帰的に定義されたstreamの例を考えてみてください。

答えて

1

にアクセスするには、一定のスタックメモリが必要かどうかを尋ねていますか?

答えはイエスであるので、場合:Streamのためapplyは(定義はLinearSeqOptimizedである)dropの用語で定義され、dropは末尾再帰であるので、whileループにコンパイルされています。

def drop(n: Int) : Stream[A] = { 
    var _this = this 
    var _n = n 

    while(!(_n <= 0 || _this.isEmpty)) { 
    _this = _this.tail 
    _n = _n - 1 
    } 
    _this 
} 

をので、スタックサイズの増加のみが_this.tailへの呼び出しから来ることができる次のようにdropが本質的に見えるのです

fromの定義では、その呼び出しはスタックを増やすことはありません。つまり、Stream.consのインスタンスを作成するだけです(再帰呼び出しは実際にはその時点で評価されないため)。

関連する問題