IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lisp Discussion :

[CLisp] - Fonction Aplatir


Sujet :

Lisp

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut [CLisp] - Fonction Aplatir
    Voici la fonction Aplatir qui transforme les sous-listes en liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun aplatir (liste)
      (cond
        ((null lst) lst)
        ((listp (car lst)) (append (aplatir (car lst)) (aplatir (cdr lst))))
        ((consp (car lst)) (append (aplatir (car lst)) (aplatir (cdr lst))))
        (T (cons (car lst) (aplatir (cdr lst))))))
    Elle fonction a merveille du moment que la sous-liste n'est pas circulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (aplatir '(a (b (c) (d)) (e f) (g (h)) nil))
    (a b c d e f g h)
     
    (aplatir '(a b (d . c)))
    *** - car: c is not a list
    Quelqu'un pourrait m'aider a corriger cette erreur ? Merci

  2. #2
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut
    Nobody willing to help a lady ?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 153
    Par défaut
    Quel est donc ton algorithme? A ce que je vois, ta fonction n'est pas désignée qu'à travailler avec des listes, c'est-à-dire, avec des cellules cons et nil. En effet, d'abord tu vérifies si LISTE est NIL. Si ce n'est pas le cas, tu vérifies si c'est une liste. Les deux dernières clauses ont peu de sens. En effet, si LISTE ne satisfait pas la condition (LISTP LISTE), elle ne satisfait pas la condition (CONSP LISTE) a fortiori. C'est évident que la clause par défaut n'est atteinte que si LISTE n'est pas une liste, mais alors l'application de CAR et de CDR à LISTE doit produire erreurs.

    Je pense, il vaut la peine que tu formules l'algorithme précisément, par exemple, en français.

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    D'accord avec ce que dit byjav sur la redondance du test consp après listp.
    En revanche il te manque un test: (atom lst)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (defun flt (lst)
      (cond
        ((null lst) nil)
        ((atom lst) (list lst))
        ((listp (car lst)) (append (flt (car lst)) (flt (cdr lst))))
        (T (cons (car lst) (flt (cdr lst))))))

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 35
    Par défaut
    Bonjour,
    Citation Envoyé par Bolboaa Voir le message
    Voici la fonction Aplatir qui transforme les sous-listes en liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (aplatir '(a (b (c) (d)) (e f) (g (h)) nil))
    (a b c d e f g h)
     
    (aplatir '(a b (d . c)))
    *** - car: c is not a list
    Quelqu'un pourrait m'aider a corriger cette erreur ? Merci
    Donc si je comprend bien les exemples, tu souhaites une version qui ne supprimerai pas les valeurs nil, et qui supporterai les paires ou listes pointées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (defun aplatir (l)
      (if l
        (cond ((atom l) (list l))
          ((atom (car l)) (cons (car l) (aplatir (cdr l))))
          (T (append (aplatir (car l)) (aplatir (cdr l))))
        )
      )
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (aplatir '(1 2 nil (2 4 nil) 3 . 4))  => (1 2 nil 2 4 nil 3 4)
    A+

Discussions similaires

  1. [CLisp] - Fonction Position
    Par Bolboaa dans le forum Lisp
    Réponses: 13
    Dernier message: 24/08/2015, 09h49
  2. Fonction Recursive en Clisp
    Par Syriano56 dans le forum Lisp
    Réponses: 9
    Dernier message: 10/04/2015, 22h16
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo