【发布时间】:2011-04-22 01:50:45
【问题描述】:
给定一个列表,
(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