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

 C Discussion :

comment faire une optimisation itérative


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Billets dans le blog
    16
    Par défaut comment faire une optimisation itérative
    bonjour,

    sachant que :
    PO=parenthèse ouvrante
    AC=autre caractère
    PF=parenthèse fermante

    voici le code:
    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
     
    void reste(){
       if(symbole==AC||symbole==PO){
          element();
          reste();
       }
    }
    void element(){
       if(symbole==AC)
          accepter(AC);
       else{
          accepter(PO);
          reste();
          accepter(PF);
       }
    }
    On peut optimiser comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void reste(){
       while(symbole==AC||symbole==PO){
          if(symbole==AC)
             accepter(AC);
          else{
             accepter(PO);
             reste();
             accepter(PF);
          }
       }
    }

    je voudrais rendre la fonction reste totalement itérative.

    Quelqu'un a une idée?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le problème n'est pas très clair...
    Quel algorithme a permis d'écrire le code posté ?
    Qu'y-a-t-il dans la fonction accepter ?

    Sinon, sans parler d'optimisation, il est toujours possible de transformer un algorithme récursif en l'équivalent itératif. Le faire avec du code est plus compliqué.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Dans la première version du code, la récursivité de reste() est terminale, donc l'optimisation doit être plus facile (puisque certains compilos sont capables de la faire eux-mêmes).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Billets dans le blog
    16
    Par défaut
    j'ai travaillé la dessus la nuit dernière et j'ai fait comme ceci:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    #include <stdio.h>
    /*
    chaine -> suite_AC | ( chaine ) | FIN
    suite_AC -> AC suite_AC | rien
    */
    typedef enum {AC,PO,PF,FIN} U_LEX;
     
    U_LEX symbole;
     
    void chaine();
    void suite_AC();
    void accepter(U_LEX lex);
    U_LEX analex();
     
    main(){
       symbole=analex();
       chaine();
    }
     
    void chaine(){
       int nbPF=0;
       while(1){
          if(symbole==AC)
             while(symbole==AC)
                accepter(AC);
          else if(symbole==PO){
             accepter(PO);
             nbPF++;
          }
          else if(symbole==PF){
             accepter(PF);
             nbPF--;
             if(nbPF<0){
                fprintf(stderr,"parenthèses mal équilibrées : parenthèse fermante en trop\n");
                exit(1);
             }
          }
          else if(symbole==FIN)
             if(nbPF==0){
                accepter(FIN);
                fprintf(stdout,"parenthèses équilibrées\n");
                exit(0);
             }
             else{
                fprintf(stderr,"parenthèses mal équilibrées : manque une parenthèse fermante\n");
                exit(1);
             }
       }
    }
     
    void accepter(U_LEX lex){
       if(symbole==lex){
          if(lex!=FIN)
             symbole=analex();
       }
       else{
          fprintf(stderr,"parenthèses mal eqilibrées : manque une parenthèse fermante\n");
          exit(2);
       }
    }
     
    U_LEX analex(){
       char T;
       T=getchar();
       if(T=='(')
          return PO;
       else if(T==')')
          return PF;
       else if(T=='\n')
          return FIN;
       else
          return AC;
    }

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Ca a l'air de fonctionner...

    quelques remarques sur le code :
    ajouter #include <stdlib.h> pour la déclaration de exit.

    Si une fonction ne prend pas de paramètre, on met void, main est de type int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void chaine(void);
    void suite_AC(void);
    void accepter(U_LEX lex);
    U_LEX analex(void);
     
    int main(void){
       symbole=analex();
       chaine();
       return 0;
    }

  6. #6
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Billets dans le blog
    16
    Par défaut
    merci pour stdlib, je me demandais quelle était l'entête pour exit

    sinon, existe-t-il une documentation sur les".h" et leurs fonction?

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

Discussions similaires

  1. Comment faire une requête optimisée avec limite
    Par beyo dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/11/2012, 21h25
  2. comment faire une boucle itérative
    Par Rniamo dans le forum C++
    Réponses: 0
    Dernier message: 18/06/2008, 21h47
  3. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13
  4. Réponses: 10
    Dernier message: 10/10/2003, 14h25

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