从方案中的列表中删除所有重复的成员

时间:2011-03-10 23:59:11

标签: scheme

我正在尝试使用递归删除列表中的重复项。这就是我所拥有的。它只删除第一个副本,而不是全部副本。

我的想法是查看第一个成员,检查它是否是列表其余部分的成员,如果是,则再次调用该函数。如果没有,请创建一个包含第一个成员的列表,并再次调用该函数的结果。我不明白为什么它不会删除所有重复项。

(define (removeDupes L)
  (cond ((null? L) ())
        ((list? (member (car L) (cdr L))) removeDupes (cdr L))
        (#T (cons ((car L) (removeDupes (cdr L)))))))

这是我修改它,它的工作原理!我理解缺点是什么问题。它需要两个参数,我只给它一个。我仍然不知道为什么第三行不起作用....

(define (removeDupes L)
  (cond ((null? L) ())
        ((list? (member (car L) (cdr L)))(removeDupes(cdr L)))
        (#T (cons (car L) (removeDupes (cdr L))))))

1 个答案:

答案 0 :(得分:3)

您的代码中存在多个错误,但是可能导致您在此处报告的问题的错误是您的括号在第三行中是错误的。您正试图致电removeDupes,但您的代码实际上并没有这样做;相反,该情况下的值最终为(cdr L)。你能明白为什么吗?

解决此问题后,您会发现代码开始产生错误。对于您可能首先遇到的问题:仔细查看您在最后一行调用cons的方式。对于您接下来可能遇到的问题:请记住()不能在Scheme中进行自我评估。

(我认为如果你仔细考虑代码的间距和布局,就很难错过这种东西。例如,在每个列表的元素之间放置空格。直到你熟悉这些东西,错误停止发生,你可能想养成在遇到一个神秘错误时检查括号的习惯:你是否在表达式的开头错过了(,或者在之前添加了(一个函数的参数,或者忘记了cond条款的额外等级,等等。等等。不要担心:过了一段时间它会停止发生......)