递归
递归的写法:需要先考虑边界条件
part1,函数的类型
part2,边界条件
part3,函数的运行
求最大值,采取递归的方式:(注意在比较当中,a的类型为Ord)
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs)
| x > maxTail = x
| otherwise = maxTail
where maxTail = maximum' xs
稍加改写,改用max函数
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs) = max x (maximum' xs)
通过递归,实现replicate函数:下图是错误的写法,otherwise后不应该添加方括号,因为list的写法可以转化为x:[]。假如n=3,经过几次递归后,n-1=0,此时会得到x:x:x:[]。所以不应该添加方括号。
replicate' :: (Num i, Ord i) => i -> a -> [a]
replicate' n x
| n < 0 = []
| otherwise = [x:replicate' (n-1) x]
*Note*: Num 不是 Ord 的子集, 表示数字不一定得拘泥于排序, 这就是在做加减法比较时要将 Num 与 Ord 类型约束区别开来的原因。
"快速"排序
1、定义类型
2、设置边界条件
3、递归,采用了 let 绑定
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a < x]
biggerSorted = quicksort [a | a<- xs, a > x]
in smallerSorted ++ {x] ++ biggerSorted