2
假設,我有一個遞歸定義的Stream
:例如,斯卡拉流和他們的堆棧內存使用情況
def from(n:Int):Stream[Int] = Stream.cons(n, from(n+1))
我想它需要不斷的堆棧內存。這是對的嗎?任何遞歸定義的stream
是否正確?你能想到任何遞歸定義的stream
例子,它使用非常量堆棧內存?
假設,我有一個遞歸定義的Stream
:例如,斯卡拉流和他們的堆棧內存使用情況
def from(n:Int):Stream[Int] = Stream.cons(n, from(n+1))
我想它需要不斷的堆棧內存。這是對的嗎?任何遞歸定義的stream
是否正確?你能想到任何遞歸定義的stream
例子,它使用非常量堆棧內存?
你問是否訪問該流需要不斷的堆棧內存?
如果是這樣的答案是肯定的:apply
爲Stream
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
的實例(因爲遞歸調用在該點實際上未進行評估)。