2013-03-07 2 views
3

Я работаю над заданием для класса информатики, и я столкнулся с проблемой. Я знаю, что сообщество не дает явных ответов на домашние задания, и это не совсем то, для чего я здесь; Я ищу, чтобы быть на верном пути или мыслительном процессе. Я постараюсь дать как можно больше информации, чтобы дать вам представление о том, с чем я имею дело, и о том, как я заблокирован.удаление элемента из списка в lisp

Прежде всего, это очень быстрое «введение» на язык LISP. Курс ведет нас через несколько разных типов языков, чтобы дать нам некоторое представление о различных аспектах программирования, а также истории их развития. Таким образом, правила проекта заключаются в следующем:

  • Невозможно использовать любые функции цикла; вместо этого, необходимо использовать рекурсию
  • Можно только использовать следующие присущей ей функции SETQ, минусы, добавить в конец, список, равно, DEFUN, автомобиль, корд и конд
  • Может создавать «вспомогательные функции», которые могут быть использованы для создания дополнительного шага в условиях функции (вроде как вложенные контуры)

У меня возникают проблемы с тем, что я должен создать функцию, которая принимает список в качестве параметра, просматривает этот список для дубликатов и удаляет дубликаты, возвращая список обратно. Поэтому, если я передал список '(a b c b a d e a), он вернется (a b c d e).

До сих пор я думал, что лучше всего создать функцию под названием list_member, которая сравнивает элемент с списком и возвращает T, если элемент находится в списке или nil, если он отсутствует в списке.

(defun list_member (x L) 
    (cond ((null L) nil)    ;if list L is empty, return NIL 
    ((equal x (car L)) T)   ;if element x is in L, return T 
    (T (list_member x (cdr L))))) ;else, recursively check remainder of L 

И я хочу использовать его в функции, rem_dup, который я начал заполнять ниже:

(defun rem_dup (L) 
    (cond ((null L) nil)      ;if list L is empty, return NIL to user 
    ((list_member (car L) cdr L)) (...) ;part I am having trouble with 
    (T (rem_dup (cdr L)))))    ;else, check rest of list recursively 

Моя проблема заключается в том, что я не могу показаться, чтобы выяснить, с функциями доступными, как собрать список с удаленными дубликатами. По сути, я не знаю, с чего начать, когда list_member возвращает true. Единственная функция, которая поддерживает формат списка, - это APPEND, потому что я имею дело с отдельными элементами (в этом случае даже вложенный список считается элементом). Все функции конкатенации списка, которые я могу использовать (APPEND, CONS, LIST), являются неразрушающими.

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

Я ценю ваши идеи.

+0

Можете ли вы создать копию списка, или это должен быть сам список, подрезанный? – Floris

+0

Просьба вложить несколько минут, чтобы узнать [как форматировать код Lisp] (http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh-Tutorial/indentation.html). – danlei

+0

Спасибо за ссылку для форматирования! Основывал мой отступ от того, что показал нам профессор ... может быть, я пришлю ему ту же ссылку. – brandont

ответ

4

У вас есть ваши случаи назад. Если первый элемент находится в остальной части списка, это дубликат, поэтому вы хотите его опустить. В противном случае вы хотите вернуть список, содержащий первый элемент, который был вставлен спереди rem_dup.

(defun rem_dup (L) 
    (cond ((null L) nil)       ; if list L is empty, return NIL to user 
     ((list_member (car L) (cdr L)) (rem_dup (cdr L))) ; Skip duplicate element 
     (T (cons (car L) (rem_dup (cdr L)))))) ; else include it, and check rest of list recursively 
+0

Большое спасибо за объяснение. У меня есть еще несколько функций, связанных с аналогичными процессами в проекте. Это должно помочь выяснить их! – brandont

Смежные вопросы