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

Delphi Discussion :

Tableau et récursivité


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut Tableau et récursivité
    Bonjour, je me trouve confronté à un problème récursivité dans un tableau à 2 dimensions.
    Voici un schéma (simplifié) de mon tableau

    F CD 141 HE
    H CG 161 DM
    -----916 PI
    -----918 CH

    Je voudrais créer un chaine de caractère pour chaque valeur du tableau de sorte a obtenir le résultat suivant : (pour cet exemple, j'ai donc 2 * 2 * 4 * 4 possibilitéés, pour un total de 64)
    FCD141HE
    FCD141DM
    FCD141PI
    FCD141CH
    FCD161HE
    FCD161DM
    FCD161PI
    FCD161CH
    .... (je ne vais pas tous les faires )

    Malheureusement je ne vois pas trop comment faire surtout que le nombre de colonne est variable et le nombre de lignes par colonne l'est aussi!
    Ce qu'il faudrait, c'est pouvoir générer de manière dynamique, autant de boucle qu'il n'y a de colonne, mais je ne sais pas du tout comment je pourrais procéder.

    J'espère avoir été suffisament clair
    Mais quelle bordel !

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Il existe certainement une solution récursive bien plus jolie que ce que je vais te montrer là, mais celle-ci en est une version linéarisée qui risque de prendre moins de temps et de ne pas dépasser la limite de pile
    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
    type
      TChoix = array {col} of array {lig} of string;
      TSolutions = array of string;
     
    procedure PleinDeChoix(const Choix : TChoix; var Solutions : TSolutions);
    var Lengths, Indices : array of integer;
        ColCount, ColCount, I, J : integer;
    begin
      ColCount := Length(Choix);
      SetLength(Lengths, ColCount);
      SetLength(Solutions, ColCount);
     
      SolCount := 1;
      for I := 0 to ColCount-1 do
      begin
        Lengths[i] := Length(Choix[i]);
        Indices[i] := 0;
        SolCount := SolCount * Lengths[i];
      end;
      SetLength(Solutions, SolCount);
      // Les Solutions[...] sont déjà toutes des chaînes vides,
      // car string est un type initialisé.
     
      for I := 0 to SolCount-1 do
      begin
        // Construction d'une solution
        for J := 0 to ColCount-1 do
          Solutions[i] := Solutions[i] + Choix[Indices[J]];
     
        // Passage au choix suivant
        for J := ColCount-1 downto 0 do
        begin
          inc(Indices[J]);
          if Indices[J] = Lengths[J] then
            Indices[J] := 0
          else
            Break;
        end;
      end;
    end;
    Attention ! Aucun des Choix[...] ne doit être de taille 0 ! Sinon c'est la violation d'accès assurée !
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Utilises Low et High avec un tableau de type Array of Array

  4. #4
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Grillé par sjrd. Ma solution est équivalente. grmbl.

    Quoique, plus simple, non ?

    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
    procedure TForm1.Button3Click(Sender: TObject);
    var NbCol : Integer; // Nombre de colonnes
        Idx   : array of integer; // Index
        Len   : array of Integer; // Longueur de chaque colonne
        I     : Integer;
    begin
     // Ce qui suit est un exemple
     NbCol := 5;
     SetLength(Len,NbCol);
     Len[0]:=3;
     Len[1]:=5;
     Len[2]:=2;
     Len[3]:=4;
     Len[4]:=3;
     
     // Boucle principale
     SetLength(Idx,NbCol);
     
     for I:=0 to NbCol - 1 do Idx[I] := 1;
     
     repeat
     
      // traite l'élément idx[0],...,idx[NbCol-1]
     
      for I := NbCol - 1 downto 0 do
          begin
           inc(Idx[I]);
           if Idx[I] <= Len[I]
              then break
              else if I>0 then Idx[I] := 1
          end;
     
     until Idx[0] > Len[0]; // Quand on en est là, on a fait le tour !
     
    end;

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    CapJack, je ne parviens pas à cromprendre tes := 1 Il doit y avoir un truc subtile qui m'échappe

    Et parce que je suis qu'un gros vilain plein d'orgueil : ta solution est plus simple parce que t'as pas fais le vrai traitement des chaînes formées

    Citation Envoyé par sjrd
    Attention ! Aucun des Choix[...] ne doit être de taille 0 ! Sinon c'est la violation d'accès assurée !
    En fait non ça passe même très bien si un dex Choix[...] est de taille 0, car alors SolCount = 0
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par sjrd
    Il existe certainement une solution récursive bien plus jolie que ce que je vais te montrer là, mais celle-ci en est une version linéarisée qui risque de prendre moins de temps et de ne pas dépasser la limite de pile
    Attention ! Aucun des Choix[...] ne doit être de taille 0 ! Sinon c'est la violation d'accès assurée !

    Merci, a fonctionne
    Par contre, j'ai du légerement adapter ton code Et je dois bien avouer que j'ai passer quelques heures à me prendre la tête et essayer de comprendre
    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
     
    procedure TForm1.PleinDeChoix(var Choix : TChoix);
    var Lengths, Indices : array of integer;
        ColCount, SolCount, I, J : integer;
        Solutions : array of string;
    begin
      ColCount := Length(Choix[1]);
      SetLength(Lengths, ColCount);
      SetLength(Indices, ColCount);
     
      SolCount := 1;
      for I := 0 to ColCount-1 do
      begin
        Lengths[i] := Length(Choix[1,i]);
        Indices[i] := 0;
        SolCount := SolCount * Lengths[i];
      end;
      SetLength(Solutions, SolCount);
      // Les Solutions[...] sont déjà toutes des chaînes vides,
      // car string est un type initialisé.
     
     
      for I := 0 to SolCount-1 do
      begin
        // Construction d'une solution
        for J := 0 to ColCount-1 do
        begin
            Solutions[i] := Solutions[i] + Choix[1,J,Indices[j]];
        end;
     
        MmList.Lines.Add(Solutions[i]);
     
        // Passage au choix suivant
        for J := ColCount-1 downto 0 do
        begin
          inc(Indices[j]);
          if Indices[j] = Lengths[J] then
            Indices[j] := 0
          else
            Break;
        end;
      end;
    end;
    La principale différence se trouvant la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        for J := 0 to ColCount-1 do
        begin
            Solutions[i] := Solutions[i] + Choix[1,J,Indices[j]];
        end;
    Ton tableau était à 1 dimension, je l'ai adapté à 2
    Mais quelle bordel !

  7. #7
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par sjrd
    CapJack, je ne parviens pas à cromprendre tes := 1 Il doit y avoir un truc subtile qui m'échappe
    Ben parce que j'ai fait l'hypothèse que les colonnes commençaient à l'indice 1. On peut remplacer par := 0 si elle sont basées zéro.

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

Discussions similaires

  1. [MySQL] Récursivité et tableau session
    Par LiliValerie dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 20/02/2012, 08h50
  2. Stack Overflow : (FloodFill) récursivité sur tableau de pixels
    Par Xplik dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 27/03/2009, 22h32
  3. Réponses: 7
    Dernier message: 28/09/2008, 16h48
  4. Chargement du tableau par récursivité
    Par JetliMohamed dans le forum Pascal
    Réponses: 4
    Dernier message: 13/01/2008, 18h42
  5. Récursivité, permutations d' éléments dans un tableau
    Par baeri dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 29/01/2007, 20h29

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