如何在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元素,生成新列表。 - 递归实现:
- 若列表为空,返回空列表;
- 若当前元素是0,跳过该元素,递归处理剩余列表;
- 若当前元素非0,将其加入结果列表头部,再递归处理剩余列表。
内容的提问来源于stack exchange,提问作者Kierra Gagnon
相关产品推荐
相关产品推荐

