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 :

Question sur les listes avec Lisp


Sujet :

Lisp

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Question sur les listes avec Lisp
    Bonjour,

    Je dois trouver le code qui traite dans une liste ayant des sous listes, le nombre de celles commençant par un chiffre. en cherchant j ai pu trouver que numberp peut m'aider. Mais j arrive pas à trouver le code.

    pourriez vous m aider à voir ou je me plante, merci d'avance.


    mon code est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun nombres (liste) 
      (cond 
       ((not liste) 0) 
       ((listp (car liste)) (and (numberp (car (car liste)))) 
         (1+ (nombres (cdr liste))))  
         (t (nombres (cdr liste))) ) )
    Resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (nombres '((5 a 1 2) (a b) b (2 a b d)))
    3
    alors que j attendais avoir 2.

    merci de l aide

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Salut !

    J'espère que tu te sers d'un editeur capable de l'indentation (Emacs...). Voici ton code proprement indenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun nombres (liste)
      (cond ((not liste) 0)
            ((listp (car liste))
             (and (numberp (car (car liste))))
             (1+ (nombres (cdr liste))))
            (t (nombres (cdr liste)))))
    La deuxième clause de cond est incorrecte.

    Une clause de cond a la forme (<condition> <forme_1> ... <forme_n>). Ayant rencontré une clause dont la <condition> est vraie, cond évalue les formes <forme_1>, ..., <forme_n> dans cette clause en renvoie la valeur de la dernière.

    Ici dans la deuxième clause on a trois S-expressions: la condition (listp (car liste)) suivie des formes (and (numberp (car (car liste)))) et (1+ (nombres (cdr liste)))) Alors, la condition est vraie si et seulement si l'element la tête de la liste originale est une liste. C'est plus ou moins évident que la fonction renvoie le nombre total des soulistes.

    Toi, tu avais besoin d'une condition composée: (and (listp (car liste)) (numberp (car (car liste))))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun nombres (liste)
      (cond ((not liste) 0)
            ((and (listp (car liste)) (numberp (car (car liste))))
             (1+ (nombres (cdr liste))))
                 (t (nombres (cdr liste)))))
    est correcte.

    Du point de vue du style, on peut remarquer le suivant. Les fonctions null et not sont synonymes, mais la première s'applique pour déterminer si un objet est nil ou pas et la seconde est utilisée dans des contextes logiques. Comme liste n'est pas une variable « logique », il vaut mieux remplacer not pour null.

    A la place de (car (car liste)) on peut écrire (caar liste).

    Mais ce qui est le pire, c'est l'algorithme récursif. La pile d'appel est proportionnelle à la longeur de la liste sans aucune justification. Une solution efficace « à la fonctionnelle » utiliserait des fonctions d'ordre supérieur : par exemple, la fonction count-if qui renvoie le nombre des elements d'une liste (ou un vecteur) qui satisfont une condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (defun nombres-2 (list)
      (count-if (lambda (x)
                  (and (listp x)
                       (numberp (first x))))
                list))
    Une boucle serait encore plus efficace. Voici un exemple un peu avancé de loop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (defun nombres-3 (list)
      (loop for x in list
           counting (and (listp x)
                         (numberp (first x)))))

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Je vous remercie,
    c'est la meilleure des réponses et tout ce qui est expliqué dedans.

Discussions similaires

  1. questions sur les listes
    Par blaise4714 dans le forum Général Python
    Réponses: 5
    Dernier message: 06/06/2008, 03h40
  2. Question sur les listes d'affichage
    Par brouss dans le forum OpenGL
    Réponses: 3
    Dernier message: 08/03/2007, 12h56
  3. question sur les listes/set/vector
    Par deubelte dans le forum SL & STL
    Réponses: 11
    Dernier message: 04/01/2007, 20h41
  4. question sur les listes/set/vector
    Par deubelte dans le forum SL & STL
    Réponses: 16
    Dernier message: 28/12/2006, 20h17
  5. des questions sur les listes chainées
    Par hunter99 dans le forum C
    Réponses: 13
    Dernier message: 05/12/2006, 22h51

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