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 :

Recherche dichotomique


Sujet :

C

  1. #1
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut Recherche dichotomique
    Bonjour je dois faire une recherche dichotomique...

    Donc j'ai fais un petit programme mais il ne fonctionne pas j'ai une violation d'accès je suis débutant, si vous pouviez m'expliquer ? de quoi il s'agit j'ai essayé de passer par les pointeurs rien à faire...

    Vous avez une idée ?

    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
    #include <stdio.h>
    #include <stdlib.h>
    int i;
     
    int recherche(int tableau[99],int index,int minimum,int maximum){
     int milieu;   
      milieu = ( maximum - minimum ) / 2;
        if (minimum==maximum)
                              if (index==tableau[milieu])
                              return index; 
                              else return 0;
     
     
                              else
                              {
                                   if (tableau[milieu]<=index){
     
                                                               return recherche(tableau,index,minimum+1,milieu);
     
     
                                                               }
                                                               else
                                                               {
     
                                                               return recherche(tableau,index,milieu,maximum);   
     
                                                               }; 
     
     
                              };
     
     
    }
     
     
    int main(){
        int tableau[99];
        tableau[0] = 1;
        printf("%d",tableau[0]);
     
        for(i=1;i<=99;i++){
                           tableau[i] = tableau[i-1] + i ;
                          printf(" - %d",tableau[i]); }
        scanf("%d",i);
        printf("%d",recherche(tableau,10,0,99));                  
        scanf("%d",i);
     
    }
    merci

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Quelques erreurs typiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(i=1;i<=99;i++)
      tableau[i] = ..
    or ton tableau est défini avec int tableau[99]; , les indices vont donc de 0 à 98...
    est faux,
    est juste mais scanf est déconseillé, voir les pages du forums pour une meilleure solution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    milieu = ( maximum - minimum ) / 2;
    n'est pas le milieu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    milieu = ( maximum + minimum ) / 2;
    l'est...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    if (index==tableau[milieu])
                              return index;
                              else return 0;
    est une erreur puisque ton élément peut être à l'indice 0 (si tu cherches 1) par exemple, c'est le premier élément de ton tableau (pourquoi d'ailleurs?)

    Ensuite, je ne vois pas pourquoi tu fais minimum+1 dans ton 1er appel récursif, rien ne prouve que l'élèment ne se trouve pas à tableau[minimum], tu ne l'as pas testé...

    Jc

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    La condition d'arrêt de ta fonction récursive est :
    et à première vue, je dirai que ta fonction part en boucle infinie et tu dois avoir un stack overflow non ?

  4. #4
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut ....
    Hargh ca ne fonctionne toujours pas !
    En faite dev c++ démarre le programme et là il se ferme tout de suite...
    Quand je debug des fois il me met access violation (segmentation fault)

    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
    #include <stdio.h>
    #include <stdlib.h>
    int i;
     
    int recherche(int tableau[100],int index,int minimum,int maximum){
     int milieu;   
      milieu = ( maximum + minimum ) / 2;
        if (minimum==maximum)
                              if (index==tableau[milieu])
                              return index; 
                              else return -1;
     
     
                              else
                              {
                                   if (tableau[milieu]<=index){
     
                                                               return recherche(tableau,index,minimum+1,milieu);
     
     
                                                               }
                                                               else
                                                               {
     
                                                               return recherche(tableau,index,milieu,maximum);   
     
                                                               }; 
     
     
                              };
     
     
    }
     
     
    int main(){
        int tableau[100];
        tableau[0] = 1;
        printf("%d",tableau[0]);
     
        for(i=1;i<=99;i++){
                           tableau[i] = tableau[i-1] + i ;
                          printf(" - %d",tableau[i]); }
     
        printf("%d",recherche(tableau,150,0,99));                  
        scanf("%d",&i);
     
    }
    Merci beaucoup pour vos réponses c'est sympa ,)

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if (tableau[milieu]<=index) 
           return recherche(tableau,index,minimum+1,milieu); 
     else  return recherche(tableau,index,milieu,maximum);
    Apparemment, le test est inversé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if (tableau[milieu]>index) 
           return recherche(tableau,index,minimum+1,milieu); 
     else  return recherche(tableau,index,milieu,maximum);
    La remarque de fearyourself est exacte au sujet de minimum+1.
    Je crois que le code suivant devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int recherche(int tableau[],int index,int minimum,int maximum)
    {
      int milieu;
      if(tableau[minimum]==index) return minimum;
      if(tableau[maximum]==index) return maximum;
      if(tableau[minimum]>index || tableau[maximum]<index ) return -1;
      milieu = ( maximum + minimum ) / 2;
      if (tableau[milieu]>index)
            return recherche(tableau,index,minimum+1,milieu);
        else
            return recherche(tableau,index,milieu,maximum-1);
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Recherche dichotomique
    Par romaindelepsi dans le forum Pascal
    Réponses: 26
    Dernier message: 18/01/2007, 15h19
  2. probleme : recherche dichotomique
    Par M.a.n.u. dans le forum C
    Réponses: 3
    Dernier message: 17/06/2006, 23h30
  3. recherche dichotomique sur chaînes de carctères
    Par contexte dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2006, 00h31
  4. Réponses: 23
    Dernier message: 10/01/2006, 13h33
  5. Recherche dichotomique
    Par Gryzzly dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 31/12/2005, 11h21

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