勉強のためにListのAPIはなるべく使わない方向で。
// P09 (**) Pack consecutive duplicates of list elements into sublists. // If a list contains repeated elements they should be placed in separate sublists. // Example: // scala> pack(List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)) // res0: List[List[Symbol]] = List(List('a, 'a, 'a, 'a), List('b), List('c, 'c), List('a, 'a), List('d), List('e, 'e, 'e, 'e)) // tail recursion def reverse[T](xs: List[T]): List[T] = { def recursive[T](ys: List[T], result: List[T]): List[T] = ys match { case Nil => result case h :: t => recursive(t, h :: result) } recursive(xs, Nil) } // tail recursion def removeLast[T](xs: List[T]): List[T] = { def recursive[T](ys: List[T], result: List[T]): List[T] = ys match { case Nil => throw new NoSuchElementException case h :: Nil => result case h :: t => recursive(t, h :: result) } reverse(recursive(xs, Nil)) } // tail recursion def pack[T](xs: List[T]): List[List[T]] = { def recursive(rest: List[T], acc: List[List[T]]): List[List[T]] = { rest match { case Nil => acc case h :: t if(acc != Nil && h == acc.last.head) => val nextAcc = List(h :: acc.last) //List[Listt[T]] recursive(t, removeLast(acc) ++ nextAcc) // List[List[T]] ++ List[List[T]] => List[List[T]] case h :: t => val nextAcc = acc ++ List(List(h)) recursive(t, nextAcc) } } recursive(xs, Nil) } val l = List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e) println(pack(l)) //=> List(List('a, 'a, 'a, 'a), List('b), List('c, 'c), List('a, 'a), List('d), List('e, 'e, 'e, 'e))
解答例
spanっすか。
No comments:
Post a Comment