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 :

Comment contourner la récursivité ?


Sujet :

Pascal

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut Comment contourner la récursivité ?
    Bonsoir,
    Si vous êtes un(e) habitué(e) du forum alors vous le savez déjà, en Tunisie, on enseigne la section Sciences de l'Informatique pour la première année. Et parmi les malheurs de la "mésaventure", la récursivité.
    On nous demande de récursifier à tort et à travers, toutes les procédures qu'on trouve. C'est très énervant ! Pour le calcul d'une factorielle, ça passe mais quand c'est pour un tri à bulles, on se demande si on a vraiment trouvé, puisqu'en réalité, la version récursive de ce tri, proposée par les enseignants, contient une boucle pour (for en Pascal). Ceci est un détail, rentrons dans le sujet.
    J'ai un test demain matin et j'ai envie de contourner toutes les questions demandant une solution récursive en donnant une solution itérative qui a l'air d'être récursive. Voilà mon idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procédure la_proc_rec(p1:type1; p2:type2.... faire:chaîne)
    si faire<>rien alors
           TRAITEMENT;
           TRAITEMENT;
           TRAITEMENT;
           la_proc_rec(p1,p2,....,"rien");
    fin si
    Voici un exemple moins abstrait, notamment sur une fonction qui remplit un tableau par n entiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure remplir(var T:tab; n:integer; faire:string);
    begin
    if faire<>'rien' then
    	begin
    	for i:=1 to n do
    		begin
    		write('remplir la case ',i,'  ');
    		readln(T[i]);
    		end;
                 remplir(t,5912,'rien');  {remplir(.....), c'est pour en faire une procédure récursive}
               {ici 5912 c'est pour rigoler car on peut mettre n'importe quoi}
     
    	end;
    end;
    Je vous demande de me donner vos avis.
    Merci!
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Sans vouloir te froisser, bien sûr, mon avis est que ce genre de chose ne va pas beaucoup plaire à ton enseignant.

    La présence d'une boucle (for, repeat, while) dans une procédure ou fonction n'enlève rien au caractère récursif de l'algorithme. Si l'on prend l'exemple du parcours d'une arborescence de répertoires avec affichage des noms de fichiers, on crée une routine Traitement_Répertoire qui, à l'aide d'une boucle, affiche les noms des fichiers et qui s'appelle elle-même lorsqu'elle rencontre un répertoire.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    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,

    Déjà répondu dans la section Algorithmes, à peu près la même chose que Alcatîz, en plus succinct.
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    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
    Le mieux c' est de faire comme le prof le demande puisque c' est lui qui va corriger ta copie. Si tu fais ce qui te viens à l' esprit, il sera peut etre enervé et tu aura une mauvaise note alors que tu peux l' eviter.

    Si tu veux coder pour toi meme ( jeux, divers,...), tu peux faire comme tu veux. Mais en attendant, fais comme le prof le veut.

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Je comprend ce que vous voulez dire et apparemment vous êtes tous d'accord mais, si ma procédure est récursive, elle répond bien à l'exercice, non ?
    Si j'ai bien compris, le traitement itératif est censé être plus difficile à trouver. Si l'itératif est plus facile à trouver dans un cas donné, il est inutile de vouloir le rendre récursif ! J'accepterais qu'on me demande de dérécursifier mais pas le contraire.
    Conclusion : vous voulez dire que le professeur est le maître du jeu, s'il sent que je me moque de sa question, il peut me donner une très mauvaise note. Maintenant, supposons qu'il ait un ensemble de règles à suivre comme : si la procédure est récursive, que le traitement est fait, on donne le maximum de points... pensez-vous qu'il puisse donner une mauvaise note à la copie ?
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  6. #6
    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
    Dio,

    Si tu fais quelque chose qui ressemble au code que tu as posté, il verra bien bien qu'en fait le traitement proprement dit n'est pas récursif (ou alors c'est une nouille ), et donc sévira probablement.

    Comme tu le dis, c'est lui qui mène le jeu, et que le jeu soit stupide ou pas, tu dois jouer selon les règles qu'il définit.

    Un prof de plus à fusiller sans tarder.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour
    Je crois que tu ne comprends pas tres bien.
    Je te donne un exemple Je me souviens quand j'etais en Terminal ,à un examen de Math, bien que le profs se sont rendus qu'il y avait une erreur dans un probleme ,il n'ont pas corrigé et on laissé faire. Dans ce cas de situation les initiatives venant de la part de l'etudiant sont tres bien bienvenues (c'est a dire corriger l'exercice et faire bien le travail demandé ).
    Mais dans ton cas le prof ne reflechira meme pas à deux fois avant de te donner une tres mauvaise note .
    Un autre le prof donne exercice sur la recursivité et toi tu lui sort un truc iteratif alors je crois que si c'est sur 5 tu auras 1 ou meme 0.5 .
    Par contre tu peux tout de meme demander au prof des explications sur le pourquoi sur ces genres d'exercices
    Cordialement
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  8. #8
    Membre confirmé
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Points : 589
    Points
    589
    Par défaut Re : Bonjour
    en première année j'ai eu à peu prés le même problème si ce n'est pire avec un enseignant dans la solution d'un exercice l'enseignant avait utilisé une boucle while et moi j'avais utilisé une boucle for parce que c'était plus adapté à mon gout eh ben résultat j'ai eu 0 pour cet exo quand j'ai demandé au prof il m'a dit dans la correction y a un while toi t'a mis un for depuis ce jour j'obéis au doigt et à l'œil au prof en tout cas tant que je suis à l'univ
    faut faire comme dit le prof même si c'est du n'importe quoi toi tu sais le juste du faut on est au 21siécle y a internet , developpez dieux merci.
    cordialement @+
    et vint le 20siècle et l'homme se mit à réflechir comme la machine auteur: diden138
    Langage: Pascal,OCaml,Delphi,c/c++.
    Langages web:Xhtml,Css,Php/Mysql,Javascript,Actionscript 2.0
    Plate forme:Windows XP Pro SP2./Red Hat 9.0/SUSE 10.2
    Config :Intel P4 3.2GHZ,2MO cach,512 RAM.
    Outils:Tp7,objective caml,Delphi 6 perso, C++builder 6,Visual C++ Express edition sous win,code-block sous linux(Ubuntu) .

  9. #9
    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,
    Citation Envoyé par diden138 Voir le message
    en première année j'ai eu à peu prés le même problème si ce n'est pire avec un enseignant dans la solution d'un exercice l'enseignant avait utilisé une boucle while et moi j'avais utilisé une boucle for parce que c'était plus adapté à mon gout eh ben résultat j'ai eu 0 pour cet exo quand j'ai demandé au prof il m'a dit dans la correction y a un while toi t'a mis un for depuis ce jour j'obéis au doigt et à l'œil au prof en tout cas tant que je suis à l'univ
    faut faire comme dit le prof même si c'est du n'importe quoi toi tu sais le juste du faut on est au 21siécle y a internet , developpez dieux merci.
    cordialement @+
    Il y a tout de même des limites à ce qu'un prof peut faire. Exiger une boucle while alors qu'une boucle for peut très bien conduire au résultat : tu as le droit d'exiger des explications, et au pire porter plainte contre ton prof (je sais, ça peut être délicat, mais les profs ne sont pas des dieux).

    Ceci sous réserve que la boucle for que tu as utilisée est "propre", c'est à dire n'utilise pas de goto (ou break, ce qui revient au même) pour sortir, car alors une boucle while est plus justifiée. Mais de là à mettre 0, bigre, un prof de plus à fusiller immédiatement.
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    Membre confirmé
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Points : 589
    Points
    589
    Par défaut Re : Bonjour
    non dans mon cas l'utilisation d'un for était plus approprié(propre) au contraire
    quand aux justifications ben faut faire comme ça et pas comme ça.
    Porter plainte contre un prof qui se trouve être votre chef de département ce n'est pas évident et vous l'aurez en plus au dos pendant au moins 3ans(j'étais en 1ére année à l'époque)
    oui tu l'a dit encore un prof à mitrailler
    cordialement @+
    et vint le 20siècle et l'homme se mit à réflechir comme la machine auteur: diden138
    Langage: Pascal,OCaml,Delphi,c/c++.
    Langages web:Xhtml,Css,Php/Mysql,Javascript,Actionscript 2.0
    Plate forme:Windows XP Pro SP2./Red Hat 9.0/SUSE 10.2
    Config :Intel P4 3.2GHZ,2MO cach,512 RAM.
    Outils:Tp7,objective caml,Delphi 6 perso, C++builder 6,Visual C++ Express edition sous win,code-block sous linux(Ubuntu) .

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 21
    Points
    21
    Par défaut
    Bonjours ce que je veux dire en deux mot sur la récursivité en général
    elle nous demande 2 chose principaux :
    1. La condition d'arrêt
    2. le traitement
    3. Enfin de taritement on a besoin d'un appel récursif


    Pour explique je prend un exemple simple à comprend .
    On veut charger un tableau récursivement
    -La condition d'arret c'est l'orsque le compteur (i) est égale à la taille du tableau (n).
    on ecrit si i>=n alors
    un appel à la procedure affiche si vous voulez.
    sinon
    le traitement c'est de lire (t[i]).
    En fin l'appel récursif de la procedure proc charge(n;var t:tab;i+1){incrémentation du compteur)

    Je croit bien que la récursivité est la plus simple choses dans le raisonnement
    de la programmation car elle dépend de logique

    Merci
    @++

  12. #12
    Membre confirmé
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Points : 589
    Points
    589
    Par défaut re:bonjour
    t'a oublier quelques truc plus importants donc je récapitule pour écrire un programme récursif en général il faut :
    primo choisir sur quoi faire l'appel récursif.
    deucio choisir comment passer du résultat de l'appel récursif au résultat que l'on cherche c'est très important ça.
    trio choisir le cas d'arrêt.
    voila.
    cordialement@+
    et vint le 20siècle et l'homme se mit à réflechir comme la machine auteur: diden138
    Langage: Pascal,OCaml,Delphi,c/c++.
    Langages web:Xhtml,Css,Php/Mysql,Javascript,Actionscript 2.0
    Plate forme:Windows XP Pro SP2./Red Hat 9.0/SUSE 10.2
    Config :Intel P4 3.2GHZ,2MO cach,512 RAM.
    Outils:Tp7,objective caml,Delphi 6 perso, C++builder 6,Visual C++ Express edition sous win,code-block sous linux(Ubuntu) .

  13. #13
    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,
    Citation Envoyé par JetliMohamed Voir le message
    Bonjours ce que je veux dire en deux mot sur la récursivité en général
    elle nous demande 2 chose principaux :
    1. La condition d'arrêt
    2. le traitement
    3. Enfin de taritement on a besoin d'un appel récursif


    Pour explique je prend un exemple simple à comprend .
    On veut charger un tableau récursivement
    -La condition d'arret c'est l'orsque le compteur (i) est égale à la taille du tableau (n).
    on ecrit si i>=n alors
    un appel à la procedure affiche si vous voulez.
    sinon
    le traitement c'est de lire (t[i]).
    En fin l'appel récursif de la procedure proc charge(n;var t:tab;i+1){incrémentation du compteur)

    Je croit bien que la récursivité est la plus simple choses dans le raisonnement
    de la programmation car elle dépend de logique
    Inchallah inkoun 3awentik ya Katrina
    Merci
    @++
    Et pour toi, il n'est pas logique de faire une simple boucle sur les éléments du tableau t ?

    La récursivité est une belle chose conceptuelle, mais il ne faut pas chercher à l'introduire n'importe où, et plus spécialement pour résoudre un problème qui est itératif, soit d'après la définition du problème, soit "intuitivement" (ton exemple en est typique : un traitement à faire sur chaque élément d'un tableau. Nulle trace de récursivité dans la définition du problème, seulement une boucle à faire).

    La récursivité est ce qu'il y a de pire concernant les ressources d'un système, que ce soit la puissance de calcul ou les besoins en mémoire. Alors, utilisons-la quand il le faut, c'est à dire quand le problème à résoudre l'appelle naturellement (exemple typique : gérer l'arborescence des dossiers/fichiers sur un disque, ce n'est bien entendu pas le seul), mais ne cherchons pas à la placer artificiellement de partout.
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/01/2012, 09h54
  2. [SOAP] [VBA] Comment contourner le probleme des "Complex types" ?
    Par jaudouy dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 06/09/2007, 12h00
  3. Réponses: 13
    Dernier message: 22/06/2006, 09h00
  4. Réponses: 6
    Dernier message: 05/04/2006, 14h14
  5. Comment contourner l'erreur ?
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2005, 10h21

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