Haskell趣学指南-学习笔记(8)

本文介绍了递归的基本概念,通过实例展示了如何使用递归求最大值、实现replicate函数以及快速排序的递归实现,强调了边界条件和类型约束的重要性。
摘要由CSDN通过智能技术生成

递归

递归的写法:需要先考虑边界条件

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值