entfernen Sie ein element aus einer Liste in lisp

Arbeite ich an einem Auftrag für eine informatik-Klasse und ich habe einen Haken. Ich weiß, dass sich die Gemeinde gegen geben explizite Antworten auf Hausaufgaben, Projekte, und das ist nicht wirklich das, was ich bin; ich bin auf der Suche auf der richtigen Spur ist oder nachgedacht Prozess. Ich werde versuchen, so viel Informationen wie möglich, um Ihnen eine Idee geben, was ich tun und wie ich gesperrt bin.

First off, ist dies eine sehr kurze "Einführung" in die Sprache LISP. Der Kurs ist unter uns durch verschiedene Arten von Sprachen zu geben, der uns einen Einblick in verschiedene Aspekte der Programmierung sowie die Geschichte Ihrer Entwicklung. Als solche, die Projekt-Regeln sind wie folgt:

  • Keine looping-Funktionen; statt, müssen Rekursion
  • Können nur die folgenden inhärenten Funktionen setq, Nachteile, Anhängen, Liste, gleich, defun, Auto, cdr, und cond
  • Erstellen können "Hilfe-Funktionen", die verwendet werden können, erstellen Sie einen zusätzlichen Schritt in einer Funktion die Bedingungen (so in der Art wie eine verschachtelte cond)

Den Teil, den ich bin Probleme mit, ich soll eine Funktion erstellen, die eine Liste als parameter, durchsucht diese Liste nach Duplikaten und entfernt die Duplikate, die Rückgabe der Liste zurück. Also, wenn ich an eine Liste '(a b c b a d e a) return (a, b, c, d, e).

So weit, dass ich dachte, es am besten, Sie erstellen eine Funktion namens list_member, vergleicht ein element einer Liste und gibt T, wenn das element in der Liste oder nil, wenn es nicht in der Liste.

(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

Und ich möchte es verwenden, in der Funktion, rem_dup, die ich angefangen habe, das ausfüllen von unten:

(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

Mein Problem ist, dass ich kann nicht scheinen, um herauszufinden,, mit den Funktionen zur Verfügung, wie man zusammen die Liste mit den Duplikaten entfernt. Im Grunde weiß ich nicht, wo anfangen mit dem, was zu tun ist, wenn list_member gibt true zurück. Die einzige Funktion, die führt eine Liste format ANHÄNGEN, denn ich bin den Umgang mit einzelnen Elementen (in diesem Fall sogar eine verschachtelte Liste als ein element). Alle in der Liste der Verkettung von Funktionen kann ich verwenden (APPEND, CONS, LIST) sind nicht-destruktiv.

Habe ich eine Menge von Lösungen, aber die Liste, die zurückgegeben wird, ist nicht sogar nah an, was ich will. Ich denke, Sie alle aufzulisten würde hier wahrscheinlich eine Verwechslung. Ich habe eine Wand mit der bitte mir die richtigen Fragen, so dass ich dachte, ich würde es jedem, um zu sehen, wenn Sie kommen mit einer Frage, die ich noch nicht gedacht haben.

Ich Schätze Ihre Einsichten.

Können Sie erstellen eine Kopie der Liste, oder muss es an die Liste selbst, getrimmt?
Bitte investieren Sie ein paar Minuten zu lernen wie format-Lisp-code.
Danke für die Formatierung, link! War stützend meine Einrückung ab, was der professor gezeigt hatte, uns zu tun...vielleicht schicke ich ihm den gleichen link.
Du bist herzlich willkommen. Ja, dein professor sollte nicht definitiv, unterrichten diese Einrückung Stil an seine Schüler.

InformationsquelleAutor brandont | 2013-03-07

Schreibe einen Kommentar