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 :

Filtre et tests de listes


Sujet :

Scheme

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut Filtre et tests de listes
    Bonjour,
    Pour "problème cons" j'ai enfin trouvé grâce à la concaténétion des cons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ;;; corrigesimple: liste (number ) ---> liste (number)
    ;;; vérifier l'ordre croissant des chiffres
    ;;; si 2 nombres sont en ordre inverse, les permuter. Uniquement les 2 premiers
    (define (corrigeSimple L)
       (if (and (pair? L) (pair? (cdr L)))
           (if (< (car L) (cadr L))
                 (cons (car L) (corrigeSimple (cdr L)))
                 (cons (cadr L) (cons (car L)  (cddr L))))
           (list (car L))))           ;; (car L) dernier de la liste  ou alors mettre L car reste le dernier de la liste
    (trace corrigeSimple) (corrigeSimple (list 2 7 5 10 9))
    Je prends un retard fou dans mes cours par correspondance.
    J'ai encore 2 problèmes en suspens, si je prends autant de temps que le premier c'est grave.
    -- A partir de la définition ci-dessus écrire une définition pour trier en ordre croissant les nombres d'une liste. C'est-à-dire qu'après (cons (cadr L) (cons (car L) (cddr L)) il faut relancer (corrigeSimple) avec la nouvelle liste Or je ne sais pas comment récupérer la nouvelle liste. J'ai essayé avec "list" mais cela ne fonctionne pas
    Ceci est un exercice d'entrainement !!!

    -- Par contre j'ai un exercice de devoir où je suis vraiment sec. Aucune idée pour pouvoir écrire une seule ligne de code:

    Écrire une fonction qui vérifie l'égalité de deux listes en utilisant la fonctionnelle filter

    Or filter a deux arguments: un argument test dont la réponse est obligatoirement booléenne et une seule liste.
    Pour ce problème je ne vous demande pas la solution mais la voie à suivre car pour moi c'est le mur.
    Merci d'avance pour votre patience.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    pour le premier exercice, tu peux applique corrigeSimple tant que les listes de départ et d'arrivée sont différentes, ce n'est pas efficace du tout, mais pourquoi pas.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut Filters- tests de listes
    Merci pour votre réponse. J'ai une idée mais je n'arrive pas la mettre en forme correcte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (define (corrigeTout L)
      (let ()
      (define (corrigeSimple L)
        (if (and (pair? L) (pair? (cdr L)))
           (if (< (car L) (cadr L))
               (cons (car L) (corrigeSimple (cdr L)))
               (cons (cadr L) (cons (car L)  (cddr L))))             
           (list (car L))))    ;; (car L) dernier de la liste  ou alors mettre L car reste le dernier de la liste
      (if (corrigeSimple L) 
         (corrigeSimple L)
         #f)))
     
    (trace corrigeTout) (corrigeTout (list 2 7 5 10 9))
    Grosso modo ce que voudrais réaliser. Bien que cela ne fonctionne pas, est-ce la bonne voie ?

    Mon problème, comme dans l'hypotèse que vous me donnez, c'est comment "pièger" la liste créer?

    Quant au "filter" c'est l'inconnu absolu !!

    Cordialement

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    PENSEZ AUX BALISES CODE /CODE

    le let() ne sert strictement à rien.
    Moi j'aurais mis dans le let le corrigeSimple de la liste passée en argument, et si la comparaison avec la liste initiale réussit on renvoie le résultat sinon on rappelle corrigeTout.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut
    OK bien compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ;;; corrigeTout: liste (number ) ---> liste (number)
    ;;; vérifier l'ordre croissant des chiffres
    ;;; si 2 nombres sont en ordre inverse, les permuter. Rendre une liste avec des nombres croissants
    (define (corrigeTout L)
      (let ((k (corrigeSimple L)))
      (define (corrigeSimple L)
        (if (and (pair? L) (pair? (cdr L)))
           (if (< (car L) (cadr L))
               (cons (car L) (corrigeSimple (cdr L)))
               (cons (cadr L) (cons (car L)  (cddr L))))                       
        (list (car L))))  ;; (car L) dernier de la liste  ou alors mettre L car reste le dernier de la liste))
      (if (not (equal? k L))
          (corrigeTout k)
          L)))
    (trace corrigeTout) (corrigeTout (list 2 7 5 10 9))
    
    
    (define (order L)
      (let ((tL (corrigeSimple L)))
        (if (not (equal? tL L))
            (order tL)
            L)))
    Bien que je n'arrive pas à interpréter texto vos modifs, je pense les avoir bien tapées. L'évaluateur n'accepte pas le "let".
    Peut-on mettre (corrigeTout k) donc (corrigeTout (corrigeSimple L)) ??

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il faut définir corrigeSimple à l'extérieur du corps de corrigeTout, ça marchera beaucoup mieux, et d'ailleurs, corrigeTout ne sert à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ;;; corrigeSimple: liste (number ) ---> liste (number)
    ;;; vérifier l'ordre croissant des chiffres
    ;;; si 2 nombres sont en ordre inverse, les permuter. Rendre une liste avec des nombres croissants
     (define (corrigeSimple L)
        (if (and (pair? L) (pair? (cdr L)))
           (if (< (car L) (cadr L))
               (cons (car L) (corrigeSimple (cdr L)))
               (cons (cadr L) (cons (car L)  (cddr L))))                       
        (list (car L))))  ;; (car L) dernier de la liste  ou alors mettre L car reste le dernier de la liste))
    
    (define (order L)
      (let ((tL (corrigeSimple L)))
        (if (not (equal? tL L))
            (order tL)
            L)))
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut Problème Filter
    OUH !! LA!! CHAPEAU !!!
    Je comprends que je n'y arrivais pas . Je ne savais pas qu'avec un "let" on pouvait obtenir une liste résultat. C'est le gros point sur lequel je butais. D'autre part faire tourner la définition jusqu'à ce que la liste entrée soit égale à la liste sortie, fallait y penser !! BRAVO !!
    J'abuse !! HUM !! Une idée pour mon filter SVP

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par debmaths Voir le message
    OUH !! LA!! CHAPEAU !!!
    Je comprends que je n'y arrivais pas . Je ne savais pas qu'avec un "let" on pouvait obtenir une liste résultat. C'est le gros point sur lequel je butais. D'autre part faire tourner la définition jusqu'à ce que la liste entrée soit égale à la liste sortie, fallait y penser !! BRAVO !!
    J'abuse !! HUM !! Une idée pour mon filter SVP
    Oui enfin, pour le tri c'est notoirement inefficace, mais comme ton tri s'apparente à un tri à bulle on ne peut pas trop demander.
    Pour le filtre, je te laisse mariner un peu (le temps que je trouve quelque chose de simple )
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut Filter
    Je pense qu'il n'y a qu'une solution. La fonctionnelle "filter" aurait comme liste argument L2 et dans test on aurait "= lecture de L1" qui serait lui-même une définition. A chaque passage dans "test" on devrait lire la liste L1. Si c'est cela je n'arrive pas le mettre en code.
    Cordialement

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut Filter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    (define (xfiltre test? L1)
      (if (pair? L1)
          (let ((k (xfiltre test? (cdr L1))))
          (if (test? (car L1))
              (cons (car L1)
               k)
               k))
          (list)))
    
    
    (define (test? L2 L1)
      (define (egal2 e)
        (= (car L1) e))
      (xfiltre egal2 (cdr L1)))
    (trace xfiltre) (test? (list 1 3 5) (list 1 6 5) )
    Voici une idée de ce que je pense répondre à la question mais le code de test? est faux !!!!

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Encore une fois, ton code de xfiltre est incorrect ne serait-ce que parce que tu renvoies list tout seul qui n'a rien a voir avec les arguments passés, renvoie plutôt L que list. Je te propose comme code pour xfiltre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (define (xfiltre test? L)
      (cond ((null? L) L)
            ((test? (car L)) (cons (car L) (xfiltre test? (cdr L))))
            (else(xfiltre test? (cdr L)))))
    Mais connais-tu le cond ?

    Dans ton cours quelle sont exactement les conditions que doit remplir xfiltre ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut Filter
    Voici ce que l'on me demande

    "Écrire une fonction qui vérifie l'égalité de deux listes en utilisant la fonctionnelle filter"

    Pour "filtre simple" voici ce que j'avais écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    define (xfiltre test? L)
      (if (pair? L)
          (let ((k (xfiltre test? (cdr L))))
            (if (test? (car L))
                (cons (car L)
                k)
                k))
       (list)))

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 47
    Points : 27
    Points
    27
    Par défaut Filter
    En désespoir de cause j'ai tourné le problème. J'ai créé une liste "association" et j'ai traité couple par couple. Cela ne correspond pas au problème posé mais enfin....
    Merci pour votre serviabilité


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    (define (merge  L1 L2)
      (cond ((and (null? L1) (null? L2)) L1)
             ((or (null? L1) (null? L2)) #f)
            (else 
             (let ((x (merge (cdr L1) (cdr L2))))
               (if (eq? x #f)
                   #f
                   (cons (list (car L1) (car L2)) x))))))     ;; pourquoi seul la combinaison (cons (list permet de faire cadr sur couple
        
    ;;; liste (nombre) --> liste (nombre)
    ;;; (xfiltre1 = L3 L4) : rend une liste des nombres égaux entre L3 et L4
    ;;; () * () rend ()
    ;;; exemple (1 2 3) (1 2 4)--> (1 2)
    ;;; rend #f si nombre d'arguments entre L3 et L4 différents ou 1 liste vide
    ;;; = peut être remplacé par < ou >
    
    (define (xfiltre1 test? L3 L4)
      (let ((tL (merge L3 L4)))
            
        (define (xfiltre2 tL)   
        (if (pair?  tL)
            (let ((couple (car tL))
                  (k (xfiltre2 (cdr tL))))
            (if (test? (car couple) (cadr couple))
               (cons (car couple) k)
                k))
            (list)))
       
        
        (if (eq? tL #f)
             #f
        (xfiltre2 tL))))
    
    (trace xfiltre1) (xfiltre1 = (list 1 2 3) (list 1 2 3))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtre exite pour une List ?
    Par nicolas_isi dans le forum Langage
    Réponses: 5
    Dernier message: 16/07/2009, 09h08
  2. Tests Unitaires List
    Par nono_31 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 21/04/2008, 16h23
  3. [filtre][formulaire] filter une liste déroulante
    Par efk pharos dans le forum IHM
    Réponses: 0
    Dernier message: 10/12/2007, 05h37
  4. Test dans Liste déroulante
    Par gentoo dans le forum IHM
    Réponses: 1
    Dernier message: 29/01/2007, 15h19
  5. Filtre avec zone de liste déroulante
    Par petitloup71 dans le forum Access
    Réponses: 10
    Dernier message: 08/07/2006, 12h21

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