You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DrRacket中不使用filter函数实现列表过滤的作业问题

解决Racket手动实现过滤函数的问题

嘿,我来帮你搞定这个问题!首先咱们先拆解你当前代码里的两个核心问题:

  1. 语法错误:Racket里if的语法是(if 条件表达式 真分支 假分支),你写的(if (null? l) l)缺少了假分支,后面直接跟(filter f l)会导致语法报错。
  2. 违反题目要求+环境问题:题目明确要求不能用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:19:26