【发布时间】:2019-11-03 04:04:54
【问题描述】:
如何实现生成无限奇数自然数 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] = ???。
【问题讨论】:
如何实现生成无限奇数自然数 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] = ???。
【问题讨论】:
正如您在评论中询问的那样,如何使用 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 作为新状态 - 可选元组的右侧部分)。
【讨论】:
你可以使用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)
【讨论】: