Binary search: Difference between revisions

Content added Content deleted
(→‎{{header|Haskell}}: A variant which returns an Either value, and uses a helper function with a simpler type.)
Line 2,045: Line 2,045:
<pre>'mu' found at index 9</pre>
<pre>'mu' found at index 9</pre>
The algorithm uses tail recursion, so the iterative and the recursive approach are identical in Haskell (the compiler will convert recursive calls into jumps).
The algorithm uses tail recursion, so the iterative and the recursive approach are identical in Haskell (the compiler will convert recursive calls into jumps).

A common optimisation of recursion is to delegate the main computation to a helper function with simpler type signature. For the option type of the return value, we could also use an Either as an alternative to a Maybe.

<lang haskell>import Data.Array (Array, Ix, (!), listArray, bounds)

-- BINARY SEARCH USING A HELPER FUNCTION WITH A SIMPLER TYPE SIGNATURE
bSearch
:: Integral a
=> (a -> Ordering) -> (a, a) -> Either String a
bSearch p (low, high) =
let go lo hi
| hi < lo = Left "not found"
| otherwise =
let mid = (lo + hi) `div` 2
in case p mid of
LT -> bSearch p (lo, mid - 1)
GT -> bSearch p (mid + 1, hi)
EQ -> Right mid
in go low high

-- Application to an array:
bSearchArray
:: (Ix i, Integral i, Ord e)
=> Array i e -> e -> Either String i
bSearchArray a x = bSearch (compare x . (a !)) (bounds a)</lang>


=={{header|HicEst}}==
=={{header|HicEst}}==