Scala Streams及其堆栈内存使用情况

时间:2011-12-22 10:37:01

标签: scala stream

假设我有一个递归定义的Stream:例如

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

我想它需要不断的堆栈内存。这是对的吗?对于任何递归定义的stream,它是否正确?你能想到任何递归定义的stream例子,它使用非常量堆栈内存吗?

1 个答案:

答案 0 :(得分:1)

您是否在询问访问流是否需要不断的堆栈内存?

如果是,答案是肯定的:apply的{​​{1}}是根据Stream(定义位于LinearSeqOptimized)和drop定义的是尾递归的,所以被编译成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的实例(因为在那时实际上没有对递归调用进行求值)。