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

Scheme Discussion :

Petit test sur les listes


Sujet :

Scheme

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut Petit test sur les listes
    Bonjour à tous ,j'ai écrit un prédicat qui renvoie vrai si une liste a au moins 3 éléments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (define (longueur? L)
      (and (pair? L)
           (pair? (cdr (cdr L)))))
    Il marche bien , sauf quand ma liste contient un seul élement , si je fais :

    (longueur (list 1 5 6)) , ça me renvoie bien true , le seul cas pour lequel j'ai une erreur c'est (longueur (list 2)) , donc quand ma liste contient un seul élément , quelqu'un saurez pourquoi ? Meme pour 0 élément ça marche , ya que quand ma liste en contient 1 que ça bug...

    merci

  2. #2
    alex_pi
    Invité(e)
    Par défaut
    Je n'ai jamais fait de Scheme de ma vie mais :
    avec un peu de chance, le and est paresseux, donc ton premier test fait que le second n'est pas executé si la liste a 0 élément. Dans le cas où la liste en a 2, le second membre du and est faux, donc ça retourne faux. En revanche, si la liste n'a qu'un élément, la première partie du and est vraie, donc il exécute la seconde, et là, plouf, il plante parce qu'il n'arrive pas à appliquer deux fois cdr sur une liste à un seul élément. Il faut donc plutôt faire quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (define (longueur? L)
      (and (pair? L)
           (and (pair? (cdr L)) 
                  (pair? (cdr (cdr L)))
            )
       )
    )
    Mais encore une fois, je n'ai jamais fait de Scheme ou de Lisp de ma vie :-)

  3. #3
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (define (longueur? xs)
      (>= (length xs) 3))

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Erwane Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (define (longueur? L)
      (and (pair? L)
           (pair? (cdr (cdr L)))))
    merci
    Dans un cas comme ça, il ne faut pas venir demander, mais il faut s'essayer à décomposer ce qui se passe.

    Je suppose que tu ne sais pas ce qui se passe quand tu fais
    Alors essayes le. Ça t'expliquera ce que tu obtiens avec ce genre d'erreur.

    Si tu ne fais pas d'essai tout seul tu ne vas pas y arriver -_-

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 17
    Points
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (define (longueur? L)
      (and (pair? L)
           (and (pair? (cdr L)) 
                  (pair? (cdr (cdr L)))
            )
       )
    )
    ça ça marche , si si garulfo je sais ce que fait (cdr (cdr (list 1)) , ça doit me renvoyer le reste , du reste d'une liste , mais ici (cdr (list 1)) est déjà vide , donc il ne peut pas y avoir de reste dans une liste vide .

    Juste une petite question , un argument de type <pair> ça veut dire quoi précisément ?

  6. #6
    Membre régulier Avatar de +Guilhem
    Profil pro
    Ingénieur d'études Java/JEE
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études Java/JEE

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par GnuVince Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (define (longueur? xs)
      (>= (length xs) 3))
    Petite remarque :
    Dans le cas d'Erwane je suppose que les listes manipulées sont de petite taille. Mais si on a 1 million d'élément dans la liste, il va falloir tous les parcourir.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Erwane Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (define (longueur? L)
      (and (pair? L)
           (and (pair? (cdr L)) 
                  (pair? (cdr (cdr L)))
            )
       )
    )
    ça ça marche , si si garulfo je sais ce que fait (cdr (cdr (list 1)) , ça doit me renvoyer le reste , du reste d'une liste , mais ici (cdr (list 1)) est déjà vide , donc il ne peut pas y avoir de reste dans une liste vide .

    Juste une petite question , un argument de type <pair> ça veut dire quoi précisément ?
    Non non tu n'as pas compris. Je n'ai jamais dit que le code de AlexPi n'était pas bon.

    AVANT de poster... tu aurais du essayer (cdr (cdr (list 1)) voir que ça lançait une erreur. Ainsi tu aurais compris d'où ça venait. C'est ça reconstruire le terme que tu utilises. « Essayer » veut dire le taper dans l'interpréteur et voir le résultat par soi-même. On apprend par la pratique pas par la lecture.

    Tu n'apprendras pas en postant pour ce genre d'erreur, tu apprendras en retrouvant toi-même d'où elle vient. Tu es bon pour la refaire encore dans un avenir proche.

Discussions similaires

  1. [SP-2007] Petite question sur les droits d'une liste de tâche ?
    Par Faro dans le forum SharePoint
    Réponses: 1
    Dernier message: 12/05/2009, 17h58
  2. Petite question sur les skip list
    Par rikoukiki dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 04/04/2009, 14h01
  3. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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