DrRacket中不使用filter函数实现列表过滤的作业问题
解决Racket手动实现过滤函数的问题
嘿,我来帮你搞定这个问题!首先咱们先拆解你当前代码里的两个核心问题:
- 语法错误:Racket里
if的语法是(if 条件表达式 真分支 假分支),你写的(if (null? l) l)缺少了假分支,后面直接跟(filter f l)会导致语法报错。 - 违反题目要求+环境问题:题目明确要求不能用
filter函数,而且你遇到filter未定义的问题,大概率是运行环境没加载包含filter的模块——不过咱们本来就不需要它,所以不用纠结这个。
手动实现过滤函数的核心思路
要实现类似filter的功能,咱们用递归就能搞定,逻辑很清晰:
- 如果列表是空的,直接返回空列表
'() - 如果列表非空,检查第一个元素是否满足函数
f的条件:- 满足的话,把这个元素加入结果列表,再递归处理剩下的元素
- 不满足的话,直接跳过当前元素,递归处理剩下的元素
正确的实现代码
这里给你两种可读性都不错的写法,选你顺手的就行:
用cond的版本(推荐,逻辑分支更清晰)
(define (remove-cond f l) (cond [(null? l) '()] ; 空列表直接返回空 [(f (car l)) ; 第一个元素满足条件 (cons (car l) (remove-cond f (cdr l)))] ; 把元素加入结果,递归处理剩余部分 [else ; 不满足条件 (remove-cond f (cdr l))])) ; 跳过当前元素,递归处理剩余部分
用嵌套if的版本
(define (remove-cond f l) (if (null? l) '() (if (f (car l)) (cons (car l) (remove-cond f (cdr l))) (remove-cond f (cdr l)))))
测试验证一下
比如咱们定义一个判断偶数的函数,用remove-cond过滤列表试试:
(define (even? n) (= (modulo n 2) 0)) (remove-cond even? '(1 2 3 4 5)) ; 运行后会返回 '(2 4)
这样就完全符合题目要求,不用filter也能实现过滤功能啦!
内容的提问来源于stack exchange,提问作者Collin
相关产品推荐
相关产品推荐

