【发布时间】:2013-06-28 12:32:12
【问题描述】:
让我们考虑生成随机数序列的问题,其约束条件是最终序列应该具有固定长度n,并且前面/后面的元素应该不同(即邻居应该不同)。我的第一个惯用方法是这样的:
val seq = Stream.continually{ Random.nextInt(10) }
.foldLeft(Stream[Int]()){ (all: Stream[Int], next: Int) =>
if (all.length > 0 && all.last != next)
all :+ next
else
all
}
.take(n)
不幸的是,这不起作用,因为 foldLeft 试图消耗整个无限流,从而导致无限循环。直观地说,根据this question,我预计这种行为仅适用于使用foldRight 的解决方案?也许我只是缺少另一个惯用的解决方案?
【问题讨论】:
-
前面/后面的元素应该不同所以不应该对所有序列重复还是只对邻居重复?
-
只有邻居应该不同。唯一元素的问题显然需要一种完全不同的方法,甚至对于任意的
n/随机数域都无法解决。抱歉不准确...