функция удаления двойников (схема) - PullRequest
2 голосов
/ 20 октября 2011
(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 ]

2 голосов
/ 20 октября 2011

'(1 2 3) действительно означает (cons 1 (cons 2 (cons 3 null)))

'(1 2 . 3) действительно означает (cons 1 (cons 2 3)

Несколько хороших тестовых примеров должны быстро выявить проблему. В общем, вы должны начать с самого маленького тестового примера, который вы можете себе представить Тогда следующий самый маленький. Тогда иди оттуда. Не прыгайте прямо на большой пример.

1 голос
/ 20 октября 2011

когда cdr равен нулю, вы просто возвращаете машину, а в другой строке вы делаете минусы на машине и рекурсию на CDR.Так вот откуда твоя пара.Это помогает?

0 голосов
/ 22 октября 2011

Я запустил ваш код без изменений и получил это:

> (delete-doubles '(1))
1

Предполагаемый вывод: (1).

Это означает, что вы возвращаете неправильное значение в списке, еслиодин элемент длиной-положение.

Если в списке есть один элемент, то он уже без двойников.То есть в этом случае вы должны вернуть lst, а не (car lst).

...