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 :

Pairs et impairs


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 Pairs et impairs
    Bonsoir , je réfléchis depuis quelques minutes à un probleme , je souhaite créer une fonction qui prend en paramètre une liste et qui rend sous forme de doublet le nombre de nombres pairs et celui des impairs , par exemple :

    (fonction (list 1 2 3)) -> (1 2)

    Donc comme algorithme j'ai pensé à ceci :

    Si la liste n'est pas vide et si le nombre est pair , on construit une liste qui itère les nombres pairs , sinon on construit une liste qui itère les nombres impairs .

    Avant d'entrer dans le code ( comme tu conseilles garu ) je voudrais vous demander si mon algo tient la route , j'ai pas l'impression , ya une sorte de contradiction . Mon idée c'est de créer 2 listes qui logiquement s'itèrent vu que le nombre est soit pair ou impair .

    Voilà , si quelqu'un possède un avis..merci bien .

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    (define (paire l)
    (if (pair? l)
    (if (even? (car l))
    (+ 1 (paire (cdr l)))
    (paire (cdr l)))
    0)
    )

    ça c'est pour calculer le nombre de chiffres pairs, ensuite il suffit de soustraire ce résultat au nombre d'éléments de la liste et du obtiens le nombre de chiffres impairs.

  3. #3
    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
    le résultat il est sous quelle donnée dans ton programme principal ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    > (paire '(1 2 3 8))
    2
    >

  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
    non mais ça je le sais bien , je savais calculer les nombres pairs depuis longtemps , là n'est pas la question , relis moi bien

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    j'essaie de voir

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Un petit foldl ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (define (even-odd-count xs)
      (foldl (lambda (x counts)
               (let ([evens (car counts)]
                     [odds (cadr counts)])
                 (if (even? x)
                     (list (+ evens 1) odds)
                     (list evens (+ odds 1))
                     )
                 )
               ) '(0 0) xs)
      )
    Mais je dois dire que la proposition de jmi23 a ses mérites, même si elle demande deux parcours de la liste au lieu d'un :
    ça c'est pour calculer le nombre de chiffres pairs, ensuite il suffit de soustraire ce résultat au nombre d'éléments de la liste et du obtiens le nombre de chiffres impairs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (define (even-count xs)
      (foldl (lambda (x evens) (if (even? x) (+ evens 1) evens)) 0 xs)
      )
    
    (define (even-odd-count xs)
      (let ([evens (even-count xs)]) (list evens (- (length xs) evens)))
      )
    --
    Jedaï

  8. #8
    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
    Avec une fonction récursive simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (define (count-evens-odds xs)
      (define (count-evens-odds-aux xs evens odds)
        (if (null? xs)
            (list evens odds)
            (if (even? (car xs))
                (count-evens-odds-aux (cdr xs) (+ 1 evens) odds)
                (count-evens-odds-aux (cdr xs) evens (+ 1 odds)))))
      (count-evens-odds-aux xs 0 0))

  9. #9
    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
    oui mais en fait j'ai oublié de préciser une chose , vos réponses sont trop complexes , elles utilisent pleins de choses que je n'ai pas vu en cours , count , null , aux...tout ceci est inconnu pour moi , revenons à mon algo , est il juste svp ?

    merci

  10. #10
    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
    Citation Envoyé par Erwane Voir le message
    oui mais en fait j'ai oublié de préciser une chose , vos réponses sont trop complexes , elles utilisent pleins de choses que je n'ai pas vu en cours , count , null , aux...tout ceci est inconnu pour moi , revenons à mon algo , est il juste svp ?

    merci
    count est une variable, aux fait partie du nom d'une fonction. Et si t'as pas vu null?, tu peux pas résoudre ce problème.

  11. #11
    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
    salut vince , en fait non je n'ai pas vu null et on m'a assuré qu'on pouvait écrire cette fonction avec simplement car , cdr , une récurisivité , odd , even , mais rien d'autre , est ce que mon algo tient la route , car c'est quand meme ça ma question initiale...

  12. #12
    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
    Citation Envoyé par Erwane Voir le message
    salut vince , en fait non je n'ai pas vu null et on m'a assuré qu'on pouvait écrire cette fonction avec simplement car , cdr , une récurisivité , odd , even , mais rien d'autre , est ce que mon algo tient la route , car c'est quand meme ça ma question initiale...
    Tu as besoin de null? pour pouvoir faire arrêter ta récursivité un moment donné. Juste dans la description que tu as donné dans ton message initial montre que tu veux t'en servir.

    null? retourne vrai si une liste est vide, faux autrement.

  13. #13
    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
    malgré mon faible niveau je suis pas entièrement d'accord avec toi , pour arreter la récurisivté je peux le faire dans une alternative if au début . Je veux avoir le nombre de pairs et de impairs sous forme de doublet , donc j'aurais 1 cons e tun list pour construire ma liste (x y) .

    Le début de la fonction se présente ainsi pour moi , elle prend une liste en argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define (pairs-impairs L)
      (if (pair? L)
         (if (even? car L)
           (+ 1 (pairs-impairs (cdr L))
    donc arrivé ici je compte les nombres pairs tu es d'accord , mais je dois aussi compter les nombres impairs , et je me doute où et comment les compter...

  14. #14
    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
    on m'a assuré qu'on pouvait écrire cette fonction avec simplement car , cdr , une récurisivité , odd , even , mais rien d'autre
    Tu as pas mentionné pair? dans la liste de fonctions dont tu pouvais te servir. pair? est pratiquement null? à l'envers. Il retourne vrai si la liste a au moins un élément, et faux si la liste est vide.

    Mais comme tu vois, tu ne peux pas écrire une fonction récursive sans cas de base, et dans le cas des liste, le cas de base c'est si la liste est vide ou non.

    Pis pour ton algorithme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Fonction compte_pairs_impairs(L, pairs, impairs)
    Si L est vide:
      retourne la liste (pairs, impairs)
    Sinon:
      Si le premier élément de L est pair:
        compte_pairs_impairs(reste de L, pairs + 1, impairs)
      Sinon
        compte_pairs_impairs(reste de L, pairs, impairs + 1)

  15. #15
    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
    merci j'ai bien compris l'algo , c'est ce que je pensais au départ mais par contre vince pour cette ligne :

    " compte_pairs_impairs(reste de L, pairs + 1, impairs)"

    je vois pas comment la traduire , j'essaye quand meme :

    compte_pairs_impairs( (cdr L) , evens + 1 , odds )

    là franchement je sais pas quoi écrire car la fonction à la base ne prend qu'un argument , la liste , ici ton algo lui donne 3 arguments...

  16. #16
    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
    Il te faut une fonction auxilière comme j'ai fait.

  17. #17
    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
    mais ils sont débiles ou quoi ceux qui donnent les exercices , je n'ai jamais vu ce que c'est une fonction auxiliaire ni meme une construction avec 2 define donc je suis coincé , bon pas grave merci bcp pour ton aide .

  18. #18
    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
    ça ira j'ai trouvé des tutos sur la structure que vous proposez , je vais réussir , merci bcp encore

  19. #19
    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
    j'ai presque réussi ya juste un petit hic de syntaxe , regardez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (define (P-I L)
      (define (paire L)
        (if (pair? L)
          (if (even? (car L))
            (+ 1 (paire (cdr L)))
              (paire (cdr L)))
                0))
      (cons (paire L) (cons(- (paire L) L)))
    le probleme ici vient juste de ma derniere ligne , que j'emploie list ou cons j'arrive pas à contruire mon doublet...car à chaque fois cons attend un argument de type nombre , quelqu'un a une petite idée pour celà ?

  20. #20
    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 GnuVince Voir le message
    Tu as besoin de null? pour pouvoir faire arrêter ta récursivité un moment donné.
    En fait, Erwane peut utiliser (eq? '() liste) pour remplacer (null? liste)

Discussions similaires

  1. Impression pages paires et impaires
    Par ely dans le forum Access
    Réponses: 1
    Dernier message: 26/01/2006, 09h44
  2. récupérer que les lignes paires ou impairs d'une proc ,?
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 5
    Dernier message: 16/11/2005, 18h03
  3. problème de suite pair et impair
    Par florane dans le forum C
    Réponses: 13
    Dernier message: 18/10/2005, 13h51
  4. VB Comment savoir si un chiffre est pair ou impair ?
    Par PRACH dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/09/2005, 18h02
  5. Réponses: 4
    Dernier message: 30/06/2002, 20h23

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