任何人都可以解释以下 Scala 代码吗?
Can anyone explain the following Scala code?
我必须在 Scala 中描述 BubbleSort,我用这段代码测试了它。但是我不太清楚每个函数的作用。
object BubbleSort {
def sort(list: List[Int]): List[Int] = list match {
case List() => List()
case head :: tail => compute(head, sort(tail))
}
def compute(data: Int, dataSet: List[Int]): List[Int] = dataSet match {
case List() => List(data)
case head :: tail => if (data <= head) data :: dataSet else head :: compute(data, tail)
}
def main(args: Array[String]) {
val list = List(3, 12, 43, 23, 7, 1, 2, 0)
println(sort(list))
}
}
谁能给我解释一下?
从最后一个元素开始查看您的函数如何工作
sort(List()) // List()
compute(0, List()) // List(0)
sort(List(0)) // List(0)
compute(2, List(0)) // List(0, 2)
sort(List(2, 0)) // List(0, 2)
compute(1, List(0, 2)) // List(0, 1, 2)
sort(List(1, 0, 2)) // List(0, 1, 2)
compute(7, List(0, 1, 2)) // List(0, 1, 2, 7)
sort(List(7, 0, 1, 2)) // List(0, 1, 2, 7)
compute(23, List(0, 1, 2, 7)) // List(0, 1, 2, 7, 23)
sort(List(23, 0, 1, 2, 7)) // List(0, 1, 2, 7, 23)
compute(43, List(0, 1, 2, 7, 23)) // List(0, 1, 2, 7, 23, 43)
sort(List(43, 0, 1, 2, 7, 23)) // List(0, 1, 2, 7, 23, 43)
compute(12, List(0, 1, 2, 7, 23, 43)) // List(0, 1, 2, 7, 12, 23, 43)
sort(List(12, 0, 1, 2, 7, 23, 43)) // List(0, 1, 2, 7, 12, 23, 43)
compute(3, List(0, 1, 2, 7, 12, 23, 43)) // List(0, 1, 2, 3, 7, 12, 23, 43)
sort(List(3, 0, 1, 2, 7, 12, 23, 43)) // List(0, 1, 2, 3, 7, 12, 23, 43)
compute
将元素 ("bubble") 推到适当的位置。
首先,冒泡排序的 classic definition 涉及在相邻元素乱序时交换它们。这里没有交换,所以它看起来不像真正的冒泡排序。
compute()
方法可能更恰当地称为 insert()
,因为它就是这样做的。它将 data
元素插入到已排序的 dataSet
中。简单的情况是当 data
元素属于 dataSet
的头部(或仅属于其中的元素)。如果不是这种情况,那么它将当前 dataSet
的头部放在一边(在调用堆栈上)并递归直到 data
can 被放在头部,然后展开调用堆栈,使用最新的 data
元素重建 dataSet
。
sort()
方法简单一些。它只是从当前 list
中取出头部并将其放置在调用堆栈中,直到 list
为空,然后进行排序。然后展开,将每个元素连同上次调用返回的排序结果一起传递给 compute()
。
我必须在 Scala 中描述 BubbleSort,我用这段代码测试了它。但是我不太清楚每个函数的作用。
object BubbleSort {
def sort(list: List[Int]): List[Int] = list match {
case List() => List()
case head :: tail => compute(head, sort(tail))
}
def compute(data: Int, dataSet: List[Int]): List[Int] = dataSet match {
case List() => List(data)
case head :: tail => if (data <= head) data :: dataSet else head :: compute(data, tail)
}
def main(args: Array[String]) {
val list = List(3, 12, 43, 23, 7, 1, 2, 0)
println(sort(list))
}
}
谁能给我解释一下?
从最后一个元素开始查看您的函数如何工作
sort(List()) // List()
compute(0, List()) // List(0)
sort(List(0)) // List(0)
compute(2, List(0)) // List(0, 2)
sort(List(2, 0)) // List(0, 2)
compute(1, List(0, 2)) // List(0, 1, 2)
sort(List(1, 0, 2)) // List(0, 1, 2)
compute(7, List(0, 1, 2)) // List(0, 1, 2, 7)
sort(List(7, 0, 1, 2)) // List(0, 1, 2, 7)
compute(23, List(0, 1, 2, 7)) // List(0, 1, 2, 7, 23)
sort(List(23, 0, 1, 2, 7)) // List(0, 1, 2, 7, 23)
compute(43, List(0, 1, 2, 7, 23)) // List(0, 1, 2, 7, 23, 43)
sort(List(43, 0, 1, 2, 7, 23)) // List(0, 1, 2, 7, 23, 43)
compute(12, List(0, 1, 2, 7, 23, 43)) // List(0, 1, 2, 7, 12, 23, 43)
sort(List(12, 0, 1, 2, 7, 23, 43)) // List(0, 1, 2, 7, 12, 23, 43)
compute(3, List(0, 1, 2, 7, 12, 23, 43)) // List(0, 1, 2, 3, 7, 12, 23, 43)
sort(List(3, 0, 1, 2, 7, 12, 23, 43)) // List(0, 1, 2, 3, 7, 12, 23, 43)
compute
将元素 ("bubble") 推到适当的位置。
首先,冒泡排序的 classic definition 涉及在相邻元素乱序时交换它们。这里没有交换,所以它看起来不像真正的冒泡排序。
compute()
方法可能更恰当地称为 insert()
,因为它就是这样做的。它将 data
元素插入到已排序的 dataSet
中。简单的情况是当 data
元素属于 dataSet
的头部(或仅属于其中的元素)。如果不是这种情况,那么它将当前 dataSet
的头部放在一边(在调用堆栈上)并递归直到 data
can 被放在头部,然后展开调用堆栈,使用最新的 data
元素重建 dataSet
。
sort()
方法简单一些。它只是从当前 list
中取出头部并将其放置在调用堆栈中,直到 list
为空,然后进行排序。然后展开,将每个元素连同上次调用返回的排序结果一起传递给 compute()
。