如何实现生成自然数1,3,5,7 ...的函数?

时间:2019-06-20 10:39:32

标签: scala stream

如何实现生成无限奇数自然数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] = ???

2 个答案:

答案 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

由于我们生成了一个无限流,因此构建函数将始终仅返回SomeNone意味着停止迭代)。

展开功能采用初始状态(此处为-1)并不断更新该状态(可选元组的右侧部分(i+2)),同时在每次迭代时提供当前状态(左侧部分)可选的元组(在这种情况下也是i+2))

换句话说,这从初始状态-1开始,然后,对于每个迭代,您都基于当前状态添加一个元素(对于第一次迭代,状态为-1,而您产生-1 + 2-可选元组的左侧),您还修改了下一次迭代的状态(对于第一次迭代,状态为-1,并且产生了-1 + 2作为新状态-可选元组的右侧)。