发布于 

递归

递归

因为递归本身也很熟悉了,所以不再细讲,主要列几个Haskell中应用递归的函数样例。注意,由于Haskell中用递归来实现循环的功能,所以有些递归看着有些别扭,需要适应。

参考书籍: Learn you a haskell

求数列中最大值

1
2
3
4
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs) = max x (maximum' xs)

replicate

replicate取一个整数x和一个量y,返回一个包含xy的列表。

1
2
3
4
replicate' :: Int -> a -> [a]
replicate' n x
true| n <= 0 = []
| otherwise = x:replicate' (n-1) x

take

take x可以从列表中取出前x个元素,形成另一个列表

1
2
3
4
5
take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n _
true| n <= 0 = []
take' _ [] = []
take' n (x:xs) = x : take' (n-1) xs

reverse

reserve函数取一个列表作为参数,返回反转的列表。

1
2
3
reserve' :: [a] => [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]

zip

zip可以取两个列表为参数,将其中的每个数捆绑在一起,形成一个二元组的列表

1
2
3
4
zip' :: [a] -> [b] -> [(a,b)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y) : zip' xs ys

qsort

使用递归的方法,我们可以很容易的构造出qsort函数--快速排序。

1
2
3
4
5
qsort :: (Ord a) => [a] -> [a]
qsort [] = []
qsort (x:xs) = left ++ [x] ++ right
truewhere left = qsort [a | a <- xs, a <= x]
right = qsort [a | a <- xs, a > x]

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 [@Songer](https://blog.songer.xyz/) 创建,使用 Stellar 作为主题。