我想生成给定长度的所有二进制序列,但我希望它懒得完成,以免超载内存。
作为我想要的一个例子,我提供了一个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或者延续。
答案 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)