2010-10-12 12 views
4

Je rencontre des problèmes pour extraire une liste d'une liste.Extraction d'une liste dans une liste

 
(defun delete (a l) 
    (cond 
     ((null l) nil) 
     ((eq (car l) a) (delete a (cdr l))) 
     (t (cons (car l) (delete a (cdr l))))))

Il supprime tout ce qui est « a » dans une liste l, mais si l pese d'une autre liste et est dans cette liste intérieure alors mon programme ne peut pas atteindre l'intérieur de cette liste intérieure.

+4

Ne pas le nom de votre fonction SUPPR. Ce nom est déjà pris par Common Lisp pour une fonction intégrée. –

+4

Le test d'égalité par défaut doit également être EQL et non EQ. –

Répondre

5

Il n'y a pas qu'une seule solution possible, mais je resterai proche de votre code. Puisqu'il s'agit de devoirs, je ne vais pas vous donner une réponse utile, mais je vais essayer de vous donner des choses à réfléchir, et donner des pointeurs détaillés:

Essayez de comprendre ce que fait votre code et ce que vous voulez vraiment faire:

(defun remove-all (a l) 
    (cond ((null l) nil) 
     ((eql (car l) a) (delete a (cdr l))) 
     (t (cons (car l) (delete a (cdr l)))))) 

(Renommé à remove-all parce delete est déjà pris, et réindenté d'une manière saine d'esprit.)

pour les listes plates, le code semble fonctionner; mais qu'en est-il des listes imbriquées? Regardons un exemple simple:

  1. Que se passera-t-il si vous évaluez (remove-all 1 '((1)))?
  2. Que voulez-vous pour cette entrée?
  3. Comment pouvez-vous y parvenir?

Jetons un coup d'oeil:

  1. Qu'arrive-t-:

    • La liste n'est pas null, allez
    • Le car n'est pas eq-1 aller sur
    • '(1) obtient cons ed à (remove-all '()), ce qui donne '((1))

    Ainsi, il n'a pas reconnu que le car lui-même est une liste qui devrait être recherchée éléments correspondant. Le problème semble se situer entre la première et la deuxième étape.

  2. Que faut-il faire:

    • Vérifiez, si le car lui-même est une liste
    • Si oui, appelez remove-all sur elle
    • Ensuite, cons le résultat à la cdr, qui a également besoin pour être "nettoyé" (Indice: Mais seulement si il y a quelque chose à)
  3. Comment exactement?

    • Ajouter une clause cond qui fait les choses mentionnées sous 2 - gauche comme devoirs
3

Vous avez besoin d'une autre clause dans laquelle vous testez si l'élément est une liste et, lorsqu'elle est vraie, récursive également dans la sous-liste.