勉強のためにListのAPIはなるべく使わない方向。
// P16 (**) Drop every Nth element from a list. // Example: // scala> drop(3, List('a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, 'j, 'k)) // res0: List[Symbol] = List('a, 'b, 'd, 'e, 'g, 'h, 'j, 'k) // not tail recursive version def drop_nottail[T](n: Int, xs: List[T]): List[T] = xs match { case h :: t if (n == 1) => drop_nottail(n - 1, t) case h :: t => h :: drop_nottail(n - 1, t) case Nil => xs } // tail recursive version def drop_tail[T](nth: Int, xs: List[T]) = { def recursive[T](n: Int, tail: List[T], acc: List[T]): List[T] = tail match { case h :: t if (n == 1) => recursive(n - 1, t, acc) case h :: t => recursive(n - 1, t, h :: acc) case Nil => acc } recursive(nth, xs, Nil).reverse } // zipwithindex version def drop_zipWithIndex[T](nth: Int, xs: List[T]) = { xs.zipWithIndex.flatMap{ case (_, i) if (i + 1 == nth) => Nil // drop nth case (e, _) => e :: Nil } } val l: List[Int] = (1 to 100000).toList //println(drop_nottail(3, l)) // StackOverflowError //println(drop_tail(3, l)) println(drop_zipWithIndex(3, l))
解答例
そうまでして1行で書きたいってか!!
No comments:
Post a Comment