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

Pascal Discussion :

Les listes chaînées


Sujet :

Pascal

  1. #21
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    à quoi sert le booléen trouvé dans le paramètre de supprimer puisque transmis par valeur ?
    Oui, tu as raison, il ne sert à rien, je mettais un booléen if a=nil, mais je peux mettre ceci à la place:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure supprimer (var a:liste);
    var valeur:integer;
    begin
           if a=nil
           then write('La liste est vide')
    Par contre pour la question 3), je l'ai testé et elle fonctionne bien,merci , mais j'ai une question, est-ce que tu pourrais me donner un exemple, avec là procédure ordre_croissant, car j'ai du mal avec la récursivité, dis moi, si c'est bien comme ceci ou non:

    Soit a une liste contenant les éléments 5,1 et 4 (dans cette ordre)
    si a <> nil
    then
    c:=5
    a contient les éléments 1 et 4
    c:=4
    a contient l'élément 1
    c:=1
    a est vide
    b^.info:=1;
    b contient 1
    on passe à la condition "si" (je n'ai pas encore dépilé dans l'ordre inverse, mais je vais le faire maintenant)
    if a<>nil
    (c'est ici mon problème a est-elle vide, ou alors a contient 1 ??)
    Je vais dire que a contient 1
    on créé b^.suivant, et on dépile: b:=b^.suivant, et b^.info=4

    donc b contient 1 et 4
    ........et b contient 1,4 et 5

    est-ce que mon passage en vert est bon ?
    (c'est au niveau de la récursivité que je bloque un peu)

    Je te remercie d'avance pour tes conseils, c'est vraiment sympa
    (encore merci )

  2. #22
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par shelzy01 Voir le message
    est-ce que mon passage en vert est bon ?
    (c'est au niveau de la récursivité que je bloque un peu)

    Je te remercie d'avance pour tes conseils, c'est vraiment sympa
    (encore merci )
    C' est un peu bon. Mais il faut savoir que lorsqu ' on depile, on continue juste après la fonction qui permet la recursivité.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure ecrire1(i:integer);
    begin
    if i<>0 then
     begin
     writeln(i);
     i:=i-1;
     ecrire(i);
     writeln('apres');
     end;
    end;
    Ici, on ecrit la valeur de i avant d' appeler fonction recursive. On losque i vaut 0, on commence à executer l' intruction juste apres ecrire(i) qui est apres. Apres ça, on revient dans les autres procedures appelées avant et on fait la meme chose.
    Regarde ci-apres la difference :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure ecrire1(i:integer);
     var a:integer;
    begin
    if i<>0 then
     begin
     a:=i;
     i:=i-1;
     ecrire(i);
     writeln(a);
     end;
    end;
    Ici, quand on rentre dans la fonction, on affecte à a la valeur de i; on desincremente i et on appelle encore ecrire jusqu' a ce i vaut zero.Ensuite
    on commence par afficher 1 qui est la derniere valeur avant 0, et en remonte jusqu' à la valeur initiale de i.

    Je ne sais pas si j' ai été clair. C' est un peu difficile à expliquer ces trucs là. Essaie d' imaginer comment ça se passe.

  3. #23
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Bonjour darrylsite;

    Je suis désolè, mais j'ai vraiment du mal avec les récursivités:
    Regarde, dans mon cours j'ai deux exemples, un facile et un, un peu plus compliqué,
    le facile:
    Soit a=(1,2,3), qu'affiche la procédure suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Procedure  P (a: liste);
    begin
    if (a<>nil) 
    then begin
           write(a^.info);
           P(a^.suivant);
           write(a^.info);
           end;
    end;
     
    RESULTATS: 1 2 3 3 2 1
    Je le fais:
    a=1,2,3
    1
    P(a^.suivant) donc a=2,3
    et c'est maintenant le problème, quand on a un appel récursif, on l'exécute tout de suite, je veux dire par là, qu'on garde les valeurs en mémoire, puis on termine là procédure, ou alors non, on termine la procédure entière jusqu'au end, et après on fait les appels récursifs ??

    Si ça ne te dérange pas est-ce que tu pourrais avec cette procédure P, m'expliquer en détaillant les étapes, avec chaque élément de a=1,2,3 ?
    Ce serai super sympa, encore désolè
    En attente de ta réponse, merci d'avance

  4. #24
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fio,

    L'appel récursif de la fonction elle-même est traité exactement comme tout autre appel de fonction : quand on l'appelle.
    Je ne vois pas trop ce que tu ne comprends pas là-dedans. :
    Si les cons volaient, il ferait nuit à midi.

  5. #25
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Bonsoir Droggo;
    Après reflexion, j'ai réussi à trouver les mêmes résultats que la procédure P, mais j'en ai une dernière et c'est 2 appels récursifs, dans la même procédure, la voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Procedure  P (a: liste);
    begin
    if (a<>nil) 
    then begin
           P(a^.suivant);
           write(a^.info);
           P(a^.suivant);
           end;
    end;
     
    Resultat: 3 2 3 1 3 2 3
    J'arrive à trouver 3 2 3 et après je n'arrive pas du tout à trouver 1 3 2 3 ??

  6. #26
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gio,

    Le mieux est de faire un petit dessin, dans le genre :
    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
    On va noter :
    
    [n]    la valeur n que le niveau de récursion en cours doit traiter
    
    a->[n] le 1er appel récursif de la procédure à un niveau donné
           si on marque a->X, alors on est à la fin de la liste,
           et la procédure ne fait rien
    
    w(n)   On va écrire la valeur n
    
    b->[n] le 2ème appel récursif de la procédure à un niveau donné
           si on marque b->X, alors on est à la fin de la liste,
           et la procédure ne fait rien
    
    Le temps passe de haut en bas,
    et le niveau de récursivité est indiqué par les décalages à droite.
    
    
    La liste contient les valeurs 1,2,3,
    on entre donc dans la procédure avec un pointeur valide,
    et la valeur vaut 1:
    
    [1]
     a->[2]
     |   a->[3]
     |   |   a->X       
     |   |   w(3)
     |   |   b->X
     |   w(2)
     |   b->[3]
     |       a->X       
     |       w(3)
     |       b->X
     w(1)
     b->[2]
         a->[3]
         |   a->X       
         |   w(3)
         |   b->X
         w(2)
         b->[3]
             a->X       
             w(3)
             b->X
    
    En prenant les ordres d'affichage de haut en bas,
    donc dans l'ordre temporel, on a :
    
    3 2 3 1 3 2 3
    
    Résultat d'un test :
    
    3 2 3 1 3 2 3
    ce n'est pas toujours aussi simple à faire, mais on peut généralement faire l'équivalent.

    Un exercice amusant est d'écrire la procédure récursive qui génère ce schéma.
    Si les cons volaient, il ferait nuit à midi.

  7. #27
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Bonjour Droggo

    Désolè, j'étais absente tout ce temps, sinon j'ai bien compris cette exercice grâce à ton schéma bien détaillé, j'ai bien vu mes erreurs, je te remercie pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Les listes chaînées
    Par AureK dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 05/09/2007, 17h52
  2. Les listes chaînées
    Par dyala dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2007, 10h09
  3. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  4. [TP 7] Problème avec les listes chaînées (error 202)
    Par thelinekioubeur dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/12/2006, 23h15
  5. Réponses: 7
    Dernier message: 22/10/2005, 19h20

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