懒惰生成Scala中给定长度的所有二进制序列

时间:2016-01-19 08:55:21

标签: scala

我想生成给定长度的所有二进制序列,但我希望它懒得完成,以免超载内存。

作为我想要的一个例子,我提供了一个Python代码,它完全符合我的要求:

def nextBinary(i, seq):
   b = seq[:i] + [1] + seq[i + 1:]
   yield b
   if i + 1 < len(seq):
       for nextSeq in nextBinary(i + 1, seq):
           yield nextSeq
       for nextSeq in nextBinary(i + 1, b):
           yield nextSeq


def genBinary(length):
    start = [0 for i in range(length)]
    yield start
    for seq in nextBinary(0, start):
        yield seq

现在genBinary返回一个我可以这样使用的生成器对象:

for seq in genBinary(2):
    print(seq)
# [0, 0]
# [1, 0]
# [0, 1]
# [1, 1]

for seq in genBinary(3):
    print(seq)
# [0, 0, 0]
# [1, 0, 0]
# [0, 1, 0]
# [0, 0, 1]
# [0, 1, 1]
# [1, 1, 0]
# [1, 0, 1]
# [1, 1, 1]

我如何在Scala中编写等效的代码?我怀疑它可能在某种程度上可以用Streams或者延续。

1 个答案:

答案 0 :(得分:4)

这是使用Streams的一种方式:

val bss: Stream[Vector[List[Boolean]]] = 
    Vector(List.empty) #:: bss.map(bs => bs.map(true :: _) ++ bs.map(false :: _))

bss(3).mkString("\n")
//res1: String =
//List(true, true, true)
//List(true, true, false)
//List(true, false, true)
//List(true, false, false)
//List(false, true, true)
//List(false, true, false)
//List(false, false, true)
//List(false, false, false)

bss(4).mkString("\n")
//res2: String =
//List(true, true, true, true)
//List(true, true, true, false)
//List(true, true, false, true)
//List(true, true, false, false)
//List(true, false, true, true)
//List(true, false, true, false)
//List(true, false, false, true)
//List(true, false, false, false)
//List(false, true, true, true)
//List(false, true, true, false)
//List(false, true, false, true)
//List(false, true, false, false)
//List(false, false, true, true)
//List(false, false, true, false)
//List(false, false, false, true)
//List(false, false, false, false)