2011-12-22 70 views
2

假設,我有一個遞歸定義的Stream:例如,斯卡拉流和他們的堆棧內存使用情況

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

我想它需要不斷的堆棧內存。這是對的嗎?任何遞歸定義的stream是否正確?你能想到任何遞歸定義的stream例子,它使用非常量堆棧內存?

回答

1

你問是否訪問該流需要不斷的堆棧內存?

如果是這樣的答案是肯定的:applyStream S處於的drop術語(定義是在LinearSeqOptimized)中所定義,並且是drop尾遞歸,所以被編譯成while循環。

這使得drop基本如下所示:

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。在您定義的from中,該調用永遠不會增加堆棧:它所做的只是構建一個Stream.cons的實例(因爲遞歸調用在該點實際上未進行評估)。