// P05 (*) Reverse a list. // Example: // scala> reverse(List(1, 1, 2, 3, 5, 8)) // res0: List[Int] = List(8, 5, 3, 2, 1, 1) object P05 { // Builtin. def reverseBuiltin[A](ls: List[A]): List[A] = ls.reverse // Simple recursive. O(n^2) def reverseRecursive[A](ls: List[A]): List[A] = ls match { case Nil => Nil case h :: tail => reverseRecursive(tail) ::: List(h) } // Tail recursive. def reverseTailRecursive[A](ls: List[A]): List[A] = { def reverseR(result: List[A], curList: List[A]): List[A] = curList match { case Nil => result case h :: tail => reverseR(h :: result, tail) } reverseR(Nil, ls) } // Pure functional def reverseFunctional[A](ls: List[A]): List[A] = ls.foldLeft(List[A]()) { (r, h) => h :: r } }