insertSortRightはinsert()の引数の1つとしてList.last(O(n))を呼び出す必要があるため、insertSortRightはinsertSortLeftよりも効率が悪いと感じます。ここで、insertSortLeftはList.head(O(1))を1つとして呼び出します。 insert()への引数の。
この理解は正しいですか?ありがとう。
def insertSortRight(unsorted: List[Int]) : List[Int] = {
(unsorted :\ List[Int]()) ((a, b) => insert(a, b))
}
def insertSortLeft(unsorted: List[Int]) : List[Int] = {
(List[Int]() /: unsorted) ((a, b) => insert(b, a))
}
def insert(a: Int, list: List[Int]) : List[Int] = list match {
case List() => List(a)
case y::ys => if (a > y) y::insert(a, ys) else a::y::ys
}
DHGは「常に左折りを好む」と答えました。しかし、Scalaでのプログラミングには別の例があります。
def flattenLeft[T](xss: List[List[T]]) = (List[T]() /: xss) (_ ::: )
def flattenRight[T](xss: List[List[T]]) = (xss :~List[T]()) ( ::: _)
これは、この場合のflattenRightは1回の関数呼び出しで達成されるのに対し、flattenLeftはn個の関数呼び出しで達成されるためだと思いますか?