首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何删除列表方案中所有重复的元素?

如何删除列表方案中所有重复的元素?
EN

Stack Overflow用户
提问于 2011-04-21 13:58:06
回答 3查看 2.5K关注 0票数 1

我的尝试是,

代码语言:javascript
代码运行次数:0
运行
复制
(define (remove-dup lst)
  (cond ((null? lst) '())
        ((null? (cdr lst)) (car lst))
        ((equal? (car lst) (car (cdr lst))) (remove-dup (cdr lst)))
        (else (cons (car lst) (remove-dup (cdr lst))))
        )

  )

我的清单是(a b c a a c c c ),我想要的是(a b c)。有什么想法吗?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-21 14:41:21

我会通过循环第二个列表来实现这一点,该列表是您构建的已见元素的列表。如果这是家庭作业,我会觉得很遗憾--理解递归是如何工作的比仅仅得到正确的答案更重要。

代码语言:javascript
代码运行次数:0
运行
复制
(define (remove-dup ls)
  (let loop ((ls ls) (seen '()))
     (cond
       ((null? ls) '())
       ((memq (car ls) seen) (loop (cdr ls) seen))
       (else (cons (car ls) (loop (cdr ls) (cons (car ls) seen))))))

更新了以适应你的评论-这可能不是最干净的解决方案,但应该会让你了解它可能是如何工作的。

代码语言:javascript
代码运行次数:0
运行
复制
(define (rdup ls)
  (let loop ((ls ls) (current #f)) ; this is bad coding style, a "magic" variable you don't expect to see in your list
     (cond
       ((null? ls) '())
       ((null? (cdr ls)) (if (eq? (car ls) current) '() ls))
       ((eq? (car ls) (cadr ls)) (loop (cdr ls) (car ls)))
       ((eq? (car ls) current) (loop (cdr ls) current))
       (else (cons (car ls) (loop (cdr ls) (car ls)))))))
票数 2
EN

Stack Overflow用户

发布于 2011-12-28 12:40:48

R5RS + SRFI1

代码语言:javascript
代码运行次数:0
运行
复制
(define (remove-duplicates lst)
    (fold-right (lambda (f r)
             (cons f (filter (lambda (x) (not (equal? x f))) r))) '() lst))
票数 2
EN

Stack Overflow用户

发布于 2014-11-09 12:46:02

使用SRFI1,您可以直接使用delete-duplicatesdelete-duplicates!http://srfi.schemers.org/srfi-1/srfi-1.html#delete-duplicates

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5740147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档