2011-12-22 3 views
2

Предположим, у меня есть рекурсивно определенный Stream: например.Скала потоков и их использование памяти в стеке

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

Я предполагаю, что для этого требуется постоянная память стека. Правильно ли это? Правильно ли это для любого рекурсивно определенного stream? Можете ли вы представить какой-либо рекурсивно определенный пример stream, который использует непостоянную стек стек?

ответ

1

Вы спрашиваете, подходит ли для доступа к, для потока требуется постоянная память стека?

Если да да: 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 (так как рекурсивный вызов на самом деле не оценивается в этой точке).

Смежные вопросы