勉強のためにListのAPIはなるべく使わない方向だけど、List要素の増殖は以前書いたので今回はList.fillを使った。
// P15 (**) Duplicate the elements of a list a given number of times. // Example: // scala> duplicateN(3, List('a, 'b, 'c, 'c, 'd)) // res0: List[Symbol] = List('a, 'a, 'a, 'b, 'b, 'b, 'c, 'c, 'c, 'c, 'c, 'c, 'd, 'd, 'd) def duplicateN[T](n: Int, xs: List[T]): List[T] = xs match { case Nil => xs case h :: t => List.fill(n)(h) ::: duplicateN(n, t) } def duplicateN_tail[T](n: Int, xs: List[T]) = { def recursive[T](n: Int, tail: List[T], acc: List[T]): List[T] = tail match { case Nil => acc case h :: t => recursive(n, t, List.fill(n)(h) ::: acc) } recursive(n, xs, Nil).reverse } def duplicateN_map[T](n: Int, xs: List[T]) = xs.flatMap(List.fill(n)(_)) val l = List('a, 'b, 'c, 'c, 'd) println(duplicateN_tail(100000, l)) println(duplicateN_map(100000, l)) println(duplicateN(100000, l)) // 末尾再帰じゃないはずだが、stackoverflowにならないのが不思議
解答例
やっぱりそうきますか。
No comments:
Post a Comment