2011-12-05 36 views
5

删除重复的号码我写了这个代码来创建从列表EN数量的参数给方案:从列表

(define (create-list . e) 
    e) 

但我需要它从该块本身的列表中删除任何重复的号码。

我已经尝试过,并搜索了几个小时,没有在其他块上放置几十行代码,找不到解决方案。

例如假设我输入

(create-list . 2 2 3 5 5) 

我需要创建为列表 '(2 3 5),而不是'(2 2 3 5 5)...

顺序的数字并不重要。

+0

参见http://stackoverflow.com/a/8651932/450148 –

回答

4

基本上,你需要做的是这样的:

(define (create-list . e) (dedupe e)) 

我能想到的一个非常简单的,但可能低效的方式做到这一点:

(define (dedupe e) 
    (if (null? e) '() 
     (cons (car e) (dedupe (filter (lambda (x) (not (equal? x (car e)))) 
            (cdr e)))))) 

如果不能利用现有的功能像filter,你可以自己做一个:

(define (my-filter pred ls) 
    (cond ((null? ls) '()) 
     ((pred (car ls)) (cons (car ls) (my-filter pred (cdr ls)))) 
     (else (my-filter pred (cdr ls))))) 
+0

才有可能创建具有CDR /车/利弊,只有原始程序相同的代码? (没有过滤器/头/尾) – spacing

+0

是的。实际上,'head'和'tail'已经分别只有'car'和'cdr'(我脑海里有太多的Haskell)。 –

+0

另外,请注意我的语法可能有点偏离 - 我最近才使用Haskell,而且我只使用stk,这是一个过时的方案解释器。 –

0

最有效率(trave一次解析列表)的方式是定义一个逐个元素遍历列表的函数。该函数存储了哪些元素已经在de-duped列表中的列表。

此解决方案优于@Tikhon Jelvis的一个优点是,列表元素不需要按次序排列,以便进行重复数据删除。

给出一个函数elem,它说,如果al元素:

(define (elem? a l) 
     (cond ((null? l) #f) 
      ((equal? a (car l)) #t) 
      (else (elem? a (cdr l))))) 

我们可以遍历列表,存储的每个元素,我们之前没有见过的:

(define (de_dupe l_remaining already_contains) 
    (cond ((null? l_remaining) already_contains) 
     ((elem? (car l_remaining) already_contains) (de_dupe (cdr l_remaining) already_contains)) 
     (else (de_dupe (cdr l_remaining) (cons (car l_remaining) already_contains))))) 

注:为了提高效率,这将返回相反顺序的元素

+1

我的版本是否需要任何顺序的元素?据我所知,事实并非如此。 –

+0

@Tikhon Jelvis:看起来像它;不过,我无法让它恢复正确的值。例如:“(create-list 3 5 4 3 4 6)”returns“(3 3)” – amindfv

+0

这不是因为顺序,这是因为我意外地遗漏了一个不在过滤器的谓词中。我现在修好了。 –

2

这一个更快:

(define (remove-duplicates l) 
    (cond ((null? l) 
     '()) 
     ((member (car l) (cdr l)) 
     (remove-duplicates (cdr l))) 
     (else 
     (cons (car l) (remove-duplicates (cdr l)))))) 

但更好, mit-scheme提供了删除重复项,它完全符合你的要求。

0
(define (delete x) 
(cond 
((null? x) x) 
((= (length x) 1) x) | ((null? (cdr x)) x) 
((= (car x) (cadr x)) (delete (cdr x))) 
(#t (cons (car x) (delete (cdr x)))) 
) 
)