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
的实例(因为递归调用在该点实际上未进行评估)。