2
(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,但我不知道如何解决它。

提前致谢。

4

3 回答 3

2

'(1 2 3)真正意思(cons 1 (cons 2 (cons 3 null)))

'(1 2 . 3)真正意思(cons 1 (cons 2 3)

几个好的测试用例应该很快就能揭示问题。一般来说,你应该从你能想到的绝对最小的测试用例开始。然后是下一个最小的。然后从那里上去。不要直接跳到一个大例子。

于 2011-10-20T19:23:04.043 回答
1

当 cdr 为空时,您只是在还车,而在 else 行中,您正在对 car 进行 cons 并在 cdr 上进行递归。这就是你的配对来自哪里。这有帮助吗?

于 2011-10-20T19:22:45.597 回答
0

我没有改变你的代码并得到了这个:

> (delete-doubles '(1))
1

预期的输出是(1)。

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

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

于 2011-10-22T14:07:06.350 回答