【问题标题】:Scala Streams and their stack memory usageScala Streams 及其堆栈内存使用情况
【发布时间】:2012-01-26 00:30:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: scala stream


    【解决方案1】:

    您是在问访问流是否需要常量堆栈内存?

    如果是,答案是肯定的:Streams 的apply 是根据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 的一个实例(因为此时实际上并未对递归调用进行评估)。

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2010-09-21
      • 2014-05-23
      • 1970-01-01
      • 2012-03-14
      • 2011-11-30
      • 1970-01-01
      • 2020-10-12
      • 2012-01-03
      相关资源
      最近更新 更多