は、機能を実装するための別の方法である:
scala> def flatMapSublists[A,B](ls: List[A])(f: (List[A]) => List[B]): List[B] =
| List.iterate(ls, ls.size)(_.tail).flatMap(f)
flatMapSublists: [A, B](ls: List[A])(f: List[A] => List[B])List[B]
A単にDaveのflatMapSublistsTRと私との間の比較:
メソッドflatMapSublistsTRは次のように実装されて
scala> def time(count: Int)(call : => Unit):Long = {
| val start = System.currentTimeMillis
| var cnt = count
| while(cnt > 0) {
| cnt -= 1
| call
| }
| System.currentTimeMillis - start
| }
time: (count: Int)(call: => Unit)Long
scala> val xs = List.range(0,100)
scala> val fn = identity[List[Int]] _
fn: List[Int] => List[Int] = <function1>
scala> time(10000){ flatMapSublists(xs)(fn) }
res1: Long = 5732
scala> time(10000){ flatMapSublistsTR(xs)(fn) }
res2: Long = 347232
:
def flatMapSublistsTR[A,B](ls: List[A])(f: (List[A]) => List[B]): List[B] = {
@annotation.tailrec
def helper(r: List[B], ls: List[A]): List[B] = {
ls match {
case Nil => r
case [email protected](_ :: tail) => helper(r ::: f(sublist), tail)
}
}
helper(Nil, ls)
}
あなたのresu ltsはオリジナルでは間違った順序で出てきます。あなたは現在の結果を受け取り、残りのすべての結果を追加します。あなたのTRバージョンでは、あなたのリスト 'r'はすべての以前の結果を運んでいるので、現在の結果をそのリストに追加する必要があります。 –
@LuigiPlingeありがとう! – leedm777