I wouldn't call recursion boring. Quicksort in Haskell is probably my favorite two lines of code:
quicksort [] = []
quicksort (x:rest) = quicksort [y | y <- rest, y <= x] ++ [x] ++ quicksort [y | y <- rest, y > x]