我解决Schala问题的方法是首先在Haskell解决这些问题,然后翻译:
reorderings xs = take len . map (take len) . tails . cycle $ xs
where len = length xs
这是我可以想到的最容易的方法,它通过反复“左轮”编制所有可能的转变清单。
ghci> reorderings [1..5]
[[1,2,3,4,5],[2,3,4,5,1],[3,4,5,1,2],[4,5,1,2,3],[5,1,2,3,4]]
这一概念相对简单(对于那些对功能性方案拟订感到安慰的人,即)。 首先,
原始清单,产生从中提取的无限流。 其次,将这一溪流分解成溪流,而后每一溪流已下上游的第一个元素(tails
)。 其次,将每一次都限制在原始清单的长度(map(take len)
)。 最后,将溪流的流量限制在原清单的长度,因为只有<代码>len/code> 可能重新排序(take len
)。
因此,现在就在Schala这样做。
def reorderings[A](xs: List[A]):List[List[A]] = {
val len = xs.length
Stream.continually(xs).flatten // cycle
.tails
.map(_.take(len).toList)
.take(len)
.toList
}
我们只得使用一个小的工作环绕来<>>>>><>>>。 (尽管我非常惊讶地发现,Schala标准校准提供了周期(尽管我很抱歉)和几个<代码>到List(Haskell List are<>>>>>> > lazy streams(尽管S Scalas严格),但除此之外,它与Haskell完全相同,而且我可以说,其行为完全相同。 您几乎可以认为Schala s.
与Haskell s相似,但相反的情况除外。
还指出,除了没有逆向外,这几乎与dh的解决办法相同,后者(在后方)提高了效率,但(在下方)提供了“下降”令而不是“下”命令的周期。