我想尝试折叠:
def merge(lotsOfColor: List[MyColor], delta: Double): List[MyColor] =
lotsOfColor.tail.foldLeft((List(lotsOfColor.head), lotsOfColor.head)) {
case ((mergedColors, lastColor), aColor) if (lastColor diff aColor) < delta =>
(mergedColors, lastColor merge aColor)
case ((mergedColors, _), aColor) => (aColor :: mergedColors, aColor)
}._1.reverse
或者略有不同,
def merge(lotsOfColor: List[MyColor], delta: Double): List[MyColor] =
lotsOfColor.tail.foldLeft((List(lotsOfColor.head), lotsOfColor.head)) {
case ((mergedColors, lastColor), aColor) =>
if ((lastColor diff aColor) < delta)
(mergedColors, lastColor merge aColor)
else
(aColor :: mergedColors, aColor)
}._1.reverse
有Scala中使用ListBuffer,以避免在年底反过来也是另一个很酷的技巧:
import scala.collection.mutable.ListBuffer
def merge(lotsOfColor: List[MyColor], delta: Double): List[MyColor] =
lotsOfColor.tail.foldLeft((ListBuffer(lotsOfColor.head), lotsOfColor.head)) {
case ((mergedColors, lastColor), aColor) if (lastColor diff aColor) < delta =>
(mergedColors, lastColor merge aColor)
case ((mergedColors, _), aColor) =>
mergedColors += aColor
(mergedColors, aColor)
}._1.toList
您为此标记了“scale” “scala” - 我认为你的意思是后者并修正它。 – 2010-03-11 16:24:56
我认为* ams *'下面的答案是在scala中使用尾递归的一个很好的例子。 – 2010-03-11 18:41:04
有些东西可能会影响我的代码。你将颜色合并到'lastColor'中,但你永远不会使用合并的'lastColor'。当差值高于delta值时,算法的第一件事是将新颜色分配给'lastColor',然后将其添加到'mergedColors'中。这意味着只有每个合并列表中的第一个颜色保存在mergedColors中。这是你的真正意图吗? – 2010-03-11 23:47:17