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

如何在Racket中移除列表所有0?现有代码仅保留首个0

移除列表中所有0的Scheme函数优化

你的当前函数逻辑是去重而非移除所有0,它会保留首次出现的每个元素,所以第一个0会被留下。要实现移除所有0的需求,只需要遍历列表时筛选出非0的元素即可,不需要去重逻辑。

原代码及输出

原函数:

(define (trimming list)
        (define thelist '())
            (begin (for-each
                       (lambda (x)
                            (if (member x thelist)
                                #t
                            (set! thelist (cons x thelist))))
                       list)
                   (reverse thelist)))

调用示例:

(trimming (list 0 0 1 3 0 5 0))

当前输出:

'(0 1 3 5)

优化后的方案

方案一:使用内置filter函数(简洁高效)

直接过滤掉所有等于0的元素:

(define (trimming lst)
  (filter (lambda (x) (not (= x 0))) lst))

方案二:手动递归实现(适合作业要求手动逻辑的场景)

通过递归遍历列表,只保留非0元素:

(define (trimming lst)
  (cond
    ((null? lst) '())
    ((= (car lst) 0) (trimming (cdr lst)))
    (else (cons (car lst) (trimming (cdr lst))))))

测试调用:

(trimming (list 0 0 1 3 0 5 0))

优化后输出:

'(1 3 5)

逻辑说明

  • 内置filter方法:传入判断函数(lambda (x) (not (= x 0))),自动遍历列表并保留所有非0元素,生成新列表。
  • 递归实现:
    1. 若列表为空,返回空列表;
    2. 若当前元素是0,跳过该元素,递归处理剩余列表;
    3. 若当前元素非0,将其加入结果列表头部,再递归处理剩余列表。

内容的提问来源于stack exchange,提问作者Kierra Gagnon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:15:27