Я работаю над заданием для класса информатики, и я столкнулся с проблемой. Я знаю, что сообщество не дает явных ответов на домашние задания, и это не совсем то, для чего я здесь; Я ищу, чтобы быть на верном пути или мыслительном процессе. Я постараюсь дать как можно больше информации, чтобы дать вам представление о том, с чем я имею дело, и о том, как я заблокирован.удаление элемента из списка в 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), являются неразрушающими.
У меня появилось много решений, но список, который возвращается, даже не близок к тому, что я хочу. Я думаю, что перечисление их здесь, вероятно, создало бы путаницу. Я пришла к стене, задав себе правильные вопросы, поэтому я подумал, что я поместил ее всем, чтобы посмотреть, могут ли они задать вопрос, чтобы я не подумал.
Я ценю ваши идеи.
Можете ли вы создать копию списка, или это должен быть сам список, подрезанный? – Floris
Просьба вложить несколько минут, чтобы узнать [как форматировать код Lisp] (http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh-Tutorial/indentation.html). – danlei
Спасибо за ссылку для форматирования! Основывал мой отступ от того, что показал нам профессор ... может быть, я пришлю ему ту же ссылку. – brandont