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 :

Tutorial récursivité problème


Sujet :

Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Par défaut Tutorial récursivité problème
    Bonjour, j'ai préféré faire un autre topic car il est un peu différent de celui que j'ai il y a qq heurs.

    En retravaillant la procédure combinaison :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure combinaison2(st, tete: string);
    var i: integer;
    begin
      if length(st) = 1 then memo1.lines.add(tete + st)
      else
        for i := 1 to length(st) do
        begin
          combinaison1(copy(st, 2, length(st) - 1), tete + st[1]);
          st := copy(st, 2, length(st) - 1) + st[1];
        end;
    end;
    et en retravaillant le déroulement schématisé :
    http://recursivite.developpez.com/?page=page_1#L0

    Je n'arriver pas a dérouler de la même manière :
    Ici le
    ne me semble pas correct car au 1er appel de la procédure , je me retrouve avec :

    et non

    ??

    Est ce qqun pourrait me dire ou est ce que je me suis tromper ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Par défaut
    Juste pour rajouter pour moi le code qui "marche" en accord avec le schéma
    est le suivant :

    JE l'ai tourné dans tous les sens et j'arrive à qqch de marche en accord avec le corps avec ce code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure combinaison2(st, tete: string);
    var i: integer;
    begin
      if length(st) = 1 then memo1.lines.add(tete + st)
      else
        for i := 1 to length(st) do
        begin
          combinaison1(copy(st, 2, length(st) ), tete + st[1]);
          st := copy(st, 2, length(st) ) + st[1];
        end;
    end;
    Y aurait-il des erreurs ?

  3. #3
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Pourrais-tu nous dire ce que tu cherches à faire exactement ? S'agit-il de trouver toutes les combinaisons d'une ensemble de caractères donnés ?

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Oui sans le role extact de la fonction c'est dure de deviner tout seul ... surtout avec un code incomplet

    D'ailleur je le redit : Tu parle de recursivitée mais en aucun cas cette fonction telle qu'elle est recursive.
    Le but premier d'une fonction recursive est de s'auto-appeler, or je ne vois aucun appel a "Combinaison2" ..... Par contre il y a une fonction "Combinaison1" dont le code serait fort utile pour comprendre le fonctionnement de ta procedure

  5. #5
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    J'ai un doute, cela ressemble très fortement au post de Bativir :

    http://www.developpez.net/forums/sho...d.php?t=336892

    Aurait-on affaire à une joyeuse bande d'étudiants en mal s'inspiration ? Est-on en période d'examen ?

    Prière de réfléchir un peu avant de poser des questions (si mon doute est confirmé).

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Par défaut
    Bon je crois que je ne me suis pas bien fait comprendre .....
    Je débute en récursivité.
    Qu'est ce que je fait: je vais directement vers le cours proposé par Developpez.com .
    Je suis le cours pas à pas , je me teste pour savoir si j'ai bien acquis les connaissance ou pas.
    Et la en faisant des tests , je m'aperçois qu'il y a qqch qui ne va pas.
    Le problème est que le schéma de déroulement ne me semble pas en accord avec le code proposé : Voir la partie du bas .
    http://recursivite.developpez.com/?page=page_1

    Pour moi le bon code serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure combinaison2(st, tete: string);
    var i: integer;
    begin
      if length(st) = 1 then memo1.lines.add(tete + st)
      else
        for i := 1 to length(st) do
        begin
          combinaison1(copy(st, 2, length(st) ), tete + st[1]);
          st := copy(st, 2, length(st) ) + st[1];
        end;
    end;
    Aurait-on affaire à une joyeuse bande d'étudiants en mal s'inspiration ? Est-on en période d'examen ?

    Prière de réfléchir un peu avant de poser des questions (si mon doute est confirmé).
    Ton doute proviendrai peut être d'un manque d'humilité et de compassion vis à vis de débutants.


    Oui sans le role extact de la fonction c'est dure de deviner tout seul ... surtout avec un code incomplet

    D'ailleur je le redit : Tu parle de recursivitée mais en aucun cas cette fonction telle qu'elle est recursive.
    Le but premier d'une fonction recursive est de s'auto-appeler, or je ne vois aucun appel a "Combinaison2" ..... Par contre il y a une fonction "Combinaison1" dont le code serait fort utile pour comprendre le fonctionnement de ta procedure
    Dans le cours proposé par developper.com c'est marqué récursivité:
    Je pense que combinaison1 est la meme que combinaison2: c'est juste pour dire que c'est comme si on avait une autre fonction qui fait un autre programme...

  7. #7
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Citation Envoyé par bdptaki
    Ton doute proviendrai peut être d'un manque d'humilité et de compassion vis à vis de débutants.
    Pas vraiment, on observe cependant parfois des vagues de demandes identiques et "douteuses" qui transpirent le travail à rendre, je n'approuve pas cette méthode car elle dévoie l'objectif du travail de l'étudiant et l'incite à choisir la voie de la facilité. Ceci dit, visiblement ta démarche semble sérieuse.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Par défaut
    Merci pour ta constatation,

    Pour revenir à notre sujet, je suis entrain d'avancer dans mon apprentissage de la récursivité, mais je ne dois laisser aucun coin d'ombre, sinon je pourrai passer à coté de qqch d'essentiel

  9. #9
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Pas vraiment, on observe cependant parfois des vagues de demandes identiques et "douteuses" qui transpirent le travail à rendre, je n'approuve pas cette méthode car elle dévoie l'objectif du travail de l'étudiant et l'incite à choisir la voie de la facilité.
    Tout a fait d'accord avec toi.
    Par contre j'emet un certain bemol : Quand on parle de "travail a rendre" ou encore de TD, ca n'explu pas le fait de charcher des information, que ce soit a la BU sur des bouqins, sur des sites internet, aupres du Prof pour comprendre certains points ..... et pourquoi pas aupres des nombeux developeurs professionnels qui transite par ce forum.

    Totu depends de la facon dont les choses sont posées. Un TD ne doit pas etre "fait" par les autres membre mais quand il s'agit comme ici de question de comprehension ou d'analyse d'un code produit par l'eleve, je ne vois pas le probleme.
    Enfin ca depends des profs, mais pour moi, ca montre sa capacite de recherche face a un probleme, gros avantage dans le metier de la prog. Le tout est que ce qu'il a code il l'a compris. Peut importe le moyen qu'il a pris pour acquerir cette competence

    LE tout est de rester dans le domaine de l'apprentissage et non de l'assistanat.

  10. #10
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Pour ce qui est de ton probleme de recursivité, je vais essayer de te donner quelques pistes.

    LE principe de la recursivitee est de reperer dans u nalgorithme un "schema" redondant sur lequel baser son traitement.
    Ici le schema de creation d'un anagrame est un arbre qui consite a prendre chacune des lettres du mot et de lui concatener les differents anagrames des lettres qui restent.
    Donc au niveaux Zero, on a pour CLORISH 7 possibilité :
    C+Anagrame(LORISH);
    L+Anagrame(CORISH);
    O+Anagrame(CLRISH);
    R+Anagrame(CLOISH);
    I+Anagrame(CLORSH);
    S+Anagrame(CLORIH);
    H+Anagrame(CLORIS);

    On a donc besoin de 2 variables qui seront medifiee dans le temps : Tete et Str. Str etant le reste des lettres et Tete le debut de l'anagrame.

    L'algo est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Procedure Anagrame :: (Str, String), (Tete : String)
    Pour tout i alant de 1 a Taille(Str) faire
      Retirer Str[i] a Str
      Ajouter Str[i] a la fin de tete;
      Appel Anagrame(Str, Tete)
    Fin Pour
    DE cette maniere, les appels successifs seront :
    Appel(0)-i(0) : Str : 'CLORISH' - Tete : '';
    Appel(1)-i(0) : Str : 'ORISH' - Tete : 'CL';
    Appel(2)-i(0) : Str : 'RISH' - Tete : 'CLO';
    Appel(3)-i(0) : Str : 'ISH' - Tete : 'CLOR';
    Appel(4)-i(0) : Str : 'SH' - Tete : 'CLORI';
    Etc ....

    [Pause repas : LA fin tout a l'heure ]

  11. #11
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    [Retour de pause]

    Donc si on considere l'algo precedent, Dans le premier appel a Anagrame('CLORISH', '') on entre dans la boucle for et on lance Anagrame('ORISH', 'C') ce qui met en pause l'execution de l'appel precedent, le temps que cet appel soit fini. Or cet appel ne sera fini qu'apres la fin de la boucle for, c'est a dire apres avoir calculé tous les Anagrames commencant par 'CL*****' jusqu'a 'CH******'.

    De meme, le calcule de lanagrame de 'CL*****' ne se terminera qu'apres le calcul des anagrames de 'CLO****' a 'CLH****'

    Et ainsi de suite.
    Il faut donc s'arreter a un moment pour que l'on puisse finir un calcul qui entrainera le depart du calcul de l'anagrame suivant dans la boucle d'appel, et petit a petit finir chacune des procedures et rendre la main au programme.

    Cette procedure d'arret intervien avec un test de finalité.
    Ici c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si Taille(Str) = 1 alors Validation de l'anagrame tete+Str
    Ne faisant plus appel a la procedure Anagrame, on peut finir la procedure en cours et remonter a l'appel precedant.

    Anagrame('SH', 'CLORI') lance le cacul suivant :
    i=0 => Anagrame('H', 'CLORIS') qui se termine et donne 'CLORISH'
    i=1 => Anagrame('S', 'CLORIH') qui se termine et donne 'CLORIHS'

    Si on remonte un coup plus haut :
    Anagrame('ISH', 'CLOR') a lancé les calculs suivant :
    i=0 => Anagrame('SH', 'CLORI') qui on le sait se termine en donnant 'CLORISH' et 'CLORIHS'
    i=1 => Anagrame('IH', 'CLORS' qui se terminera en donnat 'CLORSIH' et 'CLORSHI'
    i=2 => Anagrame ('IS', 'CLORH') qui se terminsera en donnat 'CLORHIS' et 'CLORHSI'

    ET ainsi de suite .... jusqu'a ce que l'arbre soit parcouru entierement ....

    Des questions ?!?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Par défaut
    ok, ok merci pour l'explication, je vais étudier tout sa, et s'il y a.....

    Merci pour ton déroulement

  13. #13
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    DE rien .... mais si je peux te donner un dernier conseil : Prends une feuille de papier et parcours ton code ligne par ligne en notant sur le papier l'etat des variables cree ou non et leur valeurs.
    Ca va t'aider a comprendre comment tourne les algo.

Discussions similaires

  1. Problème de récursivité en Prolog
    Par poooky dans le forum Prolog
    Réponses: 5
    Dernier message: 04/01/2007, 17h35
  2. Problème de récursivité
    Par mehdi.berra dans le forum C
    Réponses: 8
    Dernier message: 14/12/2006, 17h42
  3. Réponses: 4
    Dernier message: 08/12/2006, 11h15
  4. glob & récursivité : étrange problème
    Par Mat_F dans le forum Langage
    Réponses: 3
    Dernier message: 27/07/2006, 12h23
  5. Problème de récursivité
    Par tazmania dans le forum C
    Réponses: 24
    Dernier message: 14/12/2005, 14h34

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