【问题标题】:How do I implement a function that generates natural numbers 1,3,5,7...?如何实现生成自然数 1、3、5、7...的函数?
【发布时间】: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] = ???

【问题讨论】:

    标签: scala stream


    【解决方案1】:

    正如您在评论中询问的那样,如何使用 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 作为新状态 - 可选元组的右侧部分)。

    【讨论】:

    • 我不太明白如何生成无限的奇数序列。可以请您详细说明一下吗?
    【解决方案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)
    
    

    【讨论】:

    • 你是如何使用展开的?
    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多