顺序查找
充分利用 Haskell 的列表推导式,可以大大简化代码:
find x list = [(n,y) | (n,y) <- zip [0.. ] list, y == x]
>>find 5 [1,2,3,4,5,0,1,2,3,4,5,6,7,8,9]
[(4,5),(10,5)]
二分查找
利用哨位,可以避免一大坨 if else 嵌套。同时,where 指令结合哨位,也可以写出比较简单容易看明白的函数逻辑。
find2 x list
| list == [] = -1
| x < b = find2 x list1
| x > b = if k >= 0 then m + 1 + k else -1
| otherwise = m
where
m = length(list) `div` 2
list1 = take m list
b = list !! m
list2 = drop (m + 1) list
k = find2 x list2
>>find2 55 [0,1,2,3,4,5,6,7,8,9]
-1
>>find2 5 [0,1,2,3,4,5,6,7,8,9]
5