【发布时间】:2012-11-11 17:52:53
【问题描述】:
考虑一下这段代码(取自 Martin Odersky 的“Functional programming principles in Scala”课程):
def sieve(s: Stream[Int]): Stream[Int] = {
s.head #:: sieve(s.tail.filter(_ % s.head != 0))
}
val primes = sieve(Stream.from(2))
primes.take(1000).toList
它工作得很好。请注意,sieve 实际上不是尾递归(或者是吗?),即使 Stream 的尾是惰性的。
但是这段代码:
def sieve(n: Int): Stream[Int] = {
n #:: sieve(n + 1).filter(_ % n != 0)
}
val primes = sieve(2)
primes.take(1000).toList
抛出StackOverflowError。
第二个例子有什么问题?我猜filter 搞砸了,但我不明白为什么。它返回一个Stream,所以它不会使评估变得急切(对吗?)
【问题讨论】:
标签: scala stream stack-overflow lazy-evaluation