删除重复的号码我写了这个代码来创建从列表EN数量的参数给方案:从列表
(define (create-list . e)
e)
但我需要它从该块本身的列表中删除任何重复的号码。
我已经尝试过,并搜索了几个小时,没有在其他块上放置几十行代码,找不到解决方案。
例如假设我输入
(create-list . 2 2 3 5 5)
我需要创建为列表 '(2 3 5),而不是'(2 2 3 5 5)...
顺序的数字并不重要。
删除重复的号码我写了这个代码来创建从列表EN数量的参数给方案:从列表
(define (create-list . e)
e)
但我需要它从该块本身的列表中删除任何重复的号码。
我已经尝试过,并搜索了几个小时,没有在其他块上放置几十行代码,找不到解决方案。
例如假设我输入
(create-list . 2 2 3 5 5)
我需要创建为列表 '(2 3 5),而不是'(2 2 3 5 5)...
顺序的数字并不重要。
基本上,你需要做的是这样的:
(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)))))
才有可能创建具有CDR /车/利弊,只有原始程序相同的代码? (没有过滤器/头/尾) – spacing
是的。实际上,'head'和'tail'已经分别只有'car'和'cdr'(我脑海里有太多的Haskell)。 –
另外,请注意我的语法可能有点偏离 - 我最近才使用Haskell,而且我只使用stk,这是一个过时的方案解释器。 –
最有效率(trave一次解析列表)的方式是定义一个逐个元素遍历列表的函数。该函数存储了哪些元素已经在de-duped列表中的列表。
此解决方案优于@Tikhon Jelvis的一个优点是,列表元素不需要按次序排列,以便进行重复数据删除。
给出一个函数elem
,它说,如果a
是l
元素:
(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)))))
注:为了提高效率,这将返回相反顺序的元素
我的版本是否需要任何顺序的元素?据我所知,事实并非如此。 –
@Tikhon Jelvis:看起来像它;不过,我无法让它恢复正确的值。例如:“(create-list 3 5 4 3 4 6)”returns“(3 3)” – amindfv
这不是因为顺序,这是因为我意外地遗漏了一个不在过滤器的谓词中。我现在修好了。 –
这一个更快:
(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提供了删除重复项,它完全符合你的要求。
(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))))
)
)
参见http://stackoverflow.com/a/8651932/450148 –