私は Scala が初めてで、Scala By Exampleを読んでいたところです。第 2 章では、著者は 2 つの異なるバージョンの Quicksort を使用しています。
1 つは命令型のスタイルです。
def sort(xs: Array[Int]) {
def swap(i: Int, j: Int) {
val t = xs(i); xs(i) = xs(j); xs(j) = t
}
def sort1(l: Int, r: Int) {
val pivot = xs((l + r) / 2)
var i = l; var j = r
while (i <= j) {
while (xs(i) < pivot) i += 1
while (xs(j) > pivot) j -= 1
if (i <= j) {
swap(i, j)
i += 1
j -= 1
}
}
if (l < j) sort1(l, j)
if (j < r) sort1(i, r)
}
sort1(0, xs.length - 1)
}
1 つは機能的なスタイルです。
def sort(xs: Array[Int]): Array[Int] = {
if (xs.length <= 1) xs
else {
val pivot = xs(xs.length / 2)
Array.concat(
sort(xs filter (pivot >)),
xs filter (pivot ==),
sort(xs filter (pivot <)))
}
}
関数型のスタイルが命令型のスタイルよりも優れていることは明らかです。それは簡潔さです。しかし、パフォーマンスはどうですか?再帰を使用するため、C などの他の命令型言語と同じように、パフォーマンスのペナルティを支払う必要がありますか? または、Scala はハイブリッド言語であり、"Scala 方式" (関数型) が優先されるため、より効率的です。
注: 著者は、機能的なスタイルはより多くのメモリを使用することに言及しました。