HiveBrain v1.2.0
Get Started
← Back to all entries
patternModerate

Finding Local Maxima

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
localmaximafinding

Problem

The following function finds all local maxima.

A local maxima is an element of a list such that it's greater than either of its neighbor elements. An element with 1 neighbor is not a local maximum.

localMaxima :: [Integer] -> [Integer]
localMaxima (x:y:z:zs) = if (y > x && y > z) then y : localMaxima (y:z:zs) 
                         else localMaxima (y:z:zs)
localMaxima _          = []


Please critique it.

Examples:

ghci> localMaxima [1,3,2,55,2] 
[3,55]
ghci> localMaxima [1,3,2,55,1000000000]
[3]

Solution

You have redundant parentheses here: (y > x && y > z). You can also make your type more generic: localMaxima :: Ord a => [a] -> [a].

I think it looks a bit cleaner using an as-pattern and guard clauses. This way you don't need zs and can just write _.

localMaxima (x:rest@(y:z:_))
  | y > x && y > z = y : localMaxima rest
  | otherwise      = localMaxima rest
localMaxima _ = []


In fact, if you know that y > z then you don't need to check if z is a local maximum.

Code Snippets

localMaxima (x:rest@(y:z:_))
  | y > x && y > z = y : localMaxima rest
  | otherwise      = localMaxima rest
localMaxima _ = []

Context

StackExchange Code Review Q#63633, answer score: 14

Revisions (0)

No revisions yet.