方案:从列表中删除重复的数字

我写了这个代码来创建一个列表

上述论点的数量


/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/////

郭文康

赞同来自:

这更快:


/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 提供 delete-duplicates, 这完全做了你想要的。

八刀丁二

赞同来自:

最有效率 /通过传递列表/ 这样做的方法是确定通过列表的函数。 element-by-element. 该函数存储列表中已有的项目列表。 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/////


注意:为了效率,它以相反的顺序返回项目。

裸奔

赞同来自:

/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////
/
/

要回复问题请先登录注册