【问题标题】:Make a recursive Stream from just 1 element?仅从 1 个元素创建递归流?
【发布时间】:2011-09-27 10:54:12
【问题描述】:

我使用递归为Gray Codes 制作了一个流,如下所示:

val gray: Stream[List[String]] = {
 List("") #:: List("0", "1") #:: gray.tail.map {gnext} 
}

在哪里

val gnext = (i:List[String]) => i.map {"0" + _} ::: i.reverse.map {"1" + _}

例如

scala> gray(2)
res17: List[String] = List(00, 01, 11, 10)

我真的不需要定义中的 List("0", "1"),因为它可以从元素 0 产生:

scala> gnext(List(""))
res18: List[java.lang.String] = List(0, 1)

那么有没有一种方法/模式可用于仅从第一个元素生成 Stream?

【问题讨论】:

    标签: scala recursion stream


    【解决方案1】:
    val gray: Stream[List[String]] = List("") #:: gray.map {gnext}
    

    或者,或者,

    val gray = Stream.iterate(List(""))(gnext)
    

    【讨论】:

    • 酷,只需使用整个列表而不是尾部。我会说第一个版本会被记忆,但iterate 的版本不会吗?
    • @Luigi gray 都不是函数,所以我认为记忆化不适用。
    • 好点 - 它们都是 Stream 对象。据我了解,Streams 是懒惰的Lists,所以如果我在新的gray 对象上引用gray(10) 将需要很长时间,但如果我随后引用gray(8) 它将是即时的,因为那个值已经被计算过了。所以它就像自动记忆。
    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2018-10-25
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多