我是Scala和函数式编程的新手。我有一个任务想将Scala列表划分为子列表列表,其中任何子列表中每个元素之间的距离小于2。我发现在线某个地方的代码可以做到这一点,但我不知道如何该代码在内部有效,有人可以详细说明吗?
def partition(input: List[Int], prev: Int,
splits: List[List[Int]]): List[List[Int]] = {
input match {
case Nil => splits
case h :: t if h-prev < 2 => partition(t, h, (h :: splits.head) :: splits.tail)
case h :: t => partition(t, h, List(h) :: splits)
}
}
val input = List(1,2,3,5,6,7,10)
partition(input,input.head,List(List.empty[Int]))
结果如下:
List [List [Int]] =列表(List(10),List(7,6,5),List(3,2,1))
这是理想的结果。
答案 0 :(得分:1)
此代码假定原始列表是从最小到最大排序的
它递归地工作,在每个调用中,输入仍然是列表的剩余内容,prev保留列表的前一个标题(input.head),splits保留到目前为止的splits
在每个呼叫中,我们查看输入(列表的左侧)
答案 1 :(得分:1)
.value