删除双打功能(方案)

时间:2011-10-20 17:41:26

标签: scheme cons

(define (delete-doubles lst)
  (cond ((null? lst) '())
        ((null? (cdr lst)) (car lst))
        ((equal? (car lst) (cadr lst)) (delete-doubles (cdr lst)))
        (else (cons (car lst) (delete-doubles (cdr lst))))))

这是我制作的代码。它用于在此元素在彼此之后显示两次或更多次时删除列表中的元素。除此之外,代码完全正常:

> (delete-doubles '(1 2 2 3 4 5))
(1 2 3 4 . 5)

我想删除.,我知道它与cons有关,但我不知道如何解决它。

提前致谢。

3 个答案:

答案 0 :(得分:2)

'(1 2 3)实际上意味着(cons 1 (cons 2 (cons 3 null)))

'(1 2 . 3)实际上意味着(cons 1 (cons 2 3)

一些好的测试用例应该能够快速揭示问题。通常,您应该从您能想到的绝对最小的测试用例开始。然后是下一个最小的。然后从那里上去。不要直接跳到一个很好的例子。

答案 1 :(得分:1)

当cdr为null时,你只是返回汽车,而在else行中,你正在做汽车和cdr的递归。这就是你的配对来自哪里。这有帮助吗?

答案 2 :(得分:0)

我保持你的代码不变,得到了这个:

> (delete-doubles '(1))
1

预期输出为(1)。

这意味着您将返回错误的值 list-is-one-element-long-clause。

如果列表中有一个元素,则它已经没有双精度数。 也就是说,在这种情况下你必须返回lst而不是(car lst)。