patternModerate
Finding Local Maxima
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.
Please critique it.
Examples:
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:
I think it looks a bit cleaner using an as-pattern and guard clauses. This way you don't need
In fact, if you know that
(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.