【问题标题】:Removing all duplicate members from a list in scheme从方案中的列表中删除所有重复的成员
【发布时间】:2011-03-10 23:59:10
【问题描述】:

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

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

(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))))))

【问题讨论】:

    标签: scheme


    【解决方案1】:

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

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

    (如果您注意代码的间距和布局,我认为这种事情更难错过。例如,在每个列表的元素之间放置空格。直到您对这些东西如此熟悉,以至于这些错误不再发生,您可能希望在遇到神秘错误时养成检查括号的习惯:您是否在表达式的开头错过了(,或者在a的参数之前添加了一个额外的(函数,或者忘记了围绕cond 子句的额外级别的括号,等等等等等等。别担心:过一会儿它就会停止发生......)

    【讨论】:

    • 我已经修复了格式,但没有任何真正伪造的东西,当然。 :-)
    • 重新编辑:我强烈推荐 Paredit 进行任何类型的 Lisp 和 Scheme 编码。除了许多其他有用的功能外,它还确保括号始终保持平衡。
    • 好的,所以你修复了所有的错误。不过,您不知道它为什么会有所帮助,这有点令人担忧!也许您遗漏了以下非常重要的事情:Scheme 中的括号根本发挥的作用与数学中的括号不同。 ((x))(x) 不同,后者与x 不同。一般来说,在 Scheme 代码中,列表 (a b c d) 意味着:以 b,c,d 作为参数调用函数 a。如果把它变成((a b c d))或者(a (b c) d)什么的,意思就完全不一样了。
    • ((x)) 和 (x) 的区别是什么?他们的意思是一样的细不要他们...在这个例子中(a(b c)d)函数a在调用函数b之后被调用,带有参数c,它也有参数d。我明白了,谢谢。但是对于 cond((null? a) a b) 这有点像我一开始的......条件满足了,所以它会寻找一个是 a 的函数,然后寻找一个是 b 的参数,不是吗?跨度>
    • 顺便说一句,如果所有这些“评估这个,评估那个,调用另一个”的东西看起来非常混乱,不要气馁。如果你坚持下去,你会习惯的,我保证。
    猜你喜欢
    • 2015-11-21
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多