如何实现生成无限奇数自然数1,3,5,7 ...的函数?
我的尝试是:
def oddNats: Stream[Int] = {
def loop(a: Int, b: Int): Stream[Int] =
cons(a, loop(b, a + 2))
loop(0, 1)
}
必须为def oddNats: Stream[Int] = ???
。
答案 0 :(得分:6)
您可以使用Stream.from(from: Int, step: Int)
:
def generate(): Stream[Int] = {
Stream.from(1, 2)
}
println(generate().take(10).toList) // this will print List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
答案 1 :(得分:4)
正如您在评论中询问的那样,如何使用Scala的2.13
Stream.unfold
:
Stream.unfold(-1)(i => Some(i+2, i+2))
// immutable.Stream[Int] = Stream(1, <not computed>)
并查看其实际功能:
Stream.unfold(-1)(i => Some(i+2, i+2)).take(10).toList
// List[Int] = List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
尽管我建议使用@nader.h solution
由于我们生成了一个无限流,因此构建函数将始终仅返回Some
(None
意味着停止迭代)。
展开功能采用初始状态(此处为-1
)并不断更新该状态(可选元组的右侧部分(i+2
)),同时在每次迭代时提供当前状态(左侧部分)可选的元组(在这种情况下也是i+2
))
换句话说,这从初始状态-1
开始,然后,对于每个迭代,您都基于当前状态添加一个元素(对于第一次迭代,状态为-1
,而您产生-1 + 2
-可选元组的左侧),您还修改了下一次迭代的状态(对于第一次迭代,状态为-1
,并且产生了-1 + 2
作为新状态-可选元组的右侧)。