给出一个列表,如何从Scheme的列表中删除非重复的元素?
(define ll '(a a a b c c c d e e e e))
我想删除所有非重复的元素,离开重复一个只有一个副本,即除去后,其结果将是
(a c e)
我的算法是:
遍历列表,比较当前元素和下一个元素。
如果它们相等,则
cons
当前元素与下一个递归调用的列表。例如,(a a a b c)
移动由左到右,遇到
a
和a
。(cons a (remove-nondup (cddr lst)))
否则,跳过当前和未来元素。
(remove-nondup (cddr lst))
我遇到的问题是
(define (remove-nondup lst)
(if (>= (length lst) 2)
(if (eq? (car lst) (cadr lst))
(cons (car lst) (remove-nondup (cdr lst)))
(remove-nondup (cddr lst)))
lst))
说我遇到的问题是,如果有连续超过3元,我也没办法继续追踪前一个。所以我想知道我应该使用另一个程序来删除所有重复?或者我可以将它们放入一个程序中?
所以我交流电的解决办法是,
(define (remove-dup lst)
(if (>= (length lst) 2)
(if (eq? (car lst) (cadr lst))
(cons (car lst) (remove-dup (cddr lst)))
(cons (car lst) (remove-dup (cdr lst))))
lst))
(define (remove-nondup-helper lst)
(if (>= (length lst) 2)
(if (eq? (car lst) (cadr lst))
(cons (car lst) (remove-nondup-helper (cdr lst)))
(remove-nondup (cddr lst)))
lst))
; call the helper function and remove-dup
(define (remove-nondup lst)
(remove-dup (remove-nondup-helper lst)))
你可以给一个没有预定义库的解决方案吗?在尝试使用库函数之前,我试图先熟悉Scheme。谢谢。 – Chan 2011-04-22 02:24:45
@Chan:我添加了'remove'的定义。我不能避免使用它,而不会使功能太糟糕,所以这是最好的。 – 2011-04-22 02:32:23