Удаление всех повторяющихся членов из списка в схеме - PullRequest
0 голосов
/ 11 марта 2011

Я пытаюсь удалить дубликаты в списке, используя рекурсию. Это то, что у меня есть. Удаляются только первые дубликаты, а не все.

Моя идея состоит в том, чтобы посмотреть на первого члена, проверить, является ли он членом остальной части списка, и если да, вызвать функцию снова. Если нет, создайте список с первым членом и результатом повторного вызова функции. Я не понимаю, почему он не удаляет все дубликаты.

(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 Ответ

3 голосов
/ 11 марта 2011

В вашем коде несколько ошибок, но, вероятно, причиной проблемы, о которой вы здесь сообщили, является то, что в третьей строке указаны неверные скобки. Вы пытаетесь позвонить removeDupes, но ваш код на самом деле этого не делает; вместо этого значение в этом случае заканчивается (cdr L). Вы понимаете почему?

Когда вы исправите это, вы обнаружите, что ваш код начинает выдавать ошибки. Для того, с кем вы столкнетесь в первую очередь: внимательно посмотрите, как вы вызываете cons в последней строке. Что касается того, с чем вы, вероятно, столкнетесь: помните, что () не является самооценкой в ​​Схеме.

(Я думаю, что такого рода вещи гораздо сложнее пропустить, если вы позаботитесь о пробелах и компоновке вашего кода. Например, ставьте пробелы между элементами каждого списка. ошибки перестают происходить, вы можете захотеть проверять круглые скобки каждый раз, когда сталкиваетесь с загадочной ошибкой: пропустили ли вы ( в начале выражения или добавили дополнительный ( перед аргументами или забыли дополнительный уровень скобок вокруг предложения cond, и т. д. и т. д. и т. д. и т. п. Не волнуйтесь: через некоторое время это прекратится ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...