我想嘗試摺疊:
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