ML语言实现:获取列表中小于指定整数的元素列表
搞定递归筛选列表元素的问题
嘿,我来帮你补全这个递归函数!你的现有代码已经摸到了门道——处理了空列表的基准情况,也判断了第一个元素是否符合条件,但问题在于只返回了第一个符合条件的元素,没有递归处理列表的剩余部分,而且语法上也缺少了else分支的处理,这会导致编译错误哦。
递归的核心思路
递归处理这类列表问题的关键是:
- 基准情况:空列表直接返回空列表(你已经写对了)
- 递归步骤:处理当前元素后,把结果和递归处理列表尾部的结果拼接起来
修正后的完整代码
fun smallethan(a, []) = [] | smallethan(a, list) = if hd(list) < a then hd(list) :: smallethan(a, tl(list)) (* 符合条件就把当前元素拼到尾部结果前面 *) else smallethan(a, tl(list)) (* 不符合就直接返回尾部的处理结果 *)
代码解释
- 第一行是基准情况:当传入的列表为空时,直接返回空列表,递归终止。
- 第二行开始是递归分支:
- 用
hd(list)取出列表的第一个元素,判断是否小于a - 如果符合条件,就用
::运算符把当前元素加到递归处理剩余列表(tl(list))得到的结果前面 - 如果不符合条件,就直接递归处理剩余列表,跳过当前元素
- 用
测试示例
比如调用smallethan(5, [3,7,2,9,4]),会一步步递归:
- 处理3:3<5 → 3 :: smallethan(5, [7,2,9,4])
- 处理7:7不小于5 → 直接返回smallethan(5, [2,9,4])
- 处理2:2<5 → 2 :: smallethan(5, [9,4])
- 处理9:9不小于5 → 直接返回smallethan(5, [4])
- 处理4:4<5 →4 :: smallethan(5, [])
- 最后基准情况返回[],所以最终结果是
[3,2,4]
这样整个递归逻辑就完整啦,能正确筛选出列表中所有小于a的元素~
内容的提问来源于stack exchange,提问作者M. Pollino
相关产品推荐
相关产品推荐

