Recursivité >> Problème important...

Recursivité >> Problème important... - PHP - Programmation

Marsh Posté le 03-07-2005 à 18:46:57    

Bonjour !  
 
Ca fait plusieurs heures que je cherche un moyen de créer des fonctions récursives en php.  
Voici le contexte :  
je suis étudiant en informatique (j'ai fait ma première année de licence). J'ai donc fait un semestre de CAML, et je connais assez bien les fonctions récursives et la programmation fonctionnelle.  
Je me met au php, et j'ai lu qu'il était possible de faire des fonctions récursives en php. J'ai typiquement essayé de créer une fonction "factorielle($n)", mais ce fut sans succès.  
J'ai donc cherché sur internet, et au fil de mes recherches, je suis tombé sur ce programme :  
 

Code :
  1. function fonction_recursive($n=0)
  2. {
  3. echo "$n <br>";
  4. $n++;
  5. if($n < 10)
  6. { // si n est inférieur à 10 on continue
  7. fonction_recursive($n);
  8. }
  9. }


 
Il se trouve que ce programme fonctionne bien. (je l'ai modifié pour les besoins de la cause, mais il fonctionne).  
 
De mon côté, j'ai fait un programme.. Au départ, il ne ressemblait pas du tout au programme ci-dessus, mais je l'ai adapté pour tenter de le faire fonctionner... En vain.  
 
Voici mon programme original :  
 

Code :
  1. // Cette fonction extrait le premier mot d'un texte. Elle fonctionne correctement.  
  2. function PremierMot($texte)
  3. {
  4. return LeMotCourrant($texte,0);
  5. }
  6. // Cette fonction renvoie le texte privé de son premier mot. Elle fonctionne bien.  
  7. function LaFin($texte)
  8. {
  9. $LePremierMot = PremierMot($texte);
  10. $EmplacementPremierMot = TailleTexte($LePremierMot);
  11. $var = substr($texte,$EmplacementPremierMot,TailleTexte($texte)-TailleTexte($LePremierMot));
  12. if($var == " " ) return "";
  13. else return $var;
  14. }
  15. // Cette fonction récursive est censée prendre un texte en paramettre, et supprimer toutes les occurences du mot "caca". Elle doit donc renvoyer un texte sans aucun mot "caca".  
  16. function Recur($texte)
  17. {
  18. if($texte == "" ) return "";
  19. else
  20.  {
  21.   if(PremierMot($texte) == "caca" ) return Recur(LaFin($texte));
  22.   else return PremierMot($texte).Recur(LaFin($texte));
  23.  } 
  24. }


 
En langage algorithmique, cette derniere fonction se traduirait par :  

Code :
  1. string Recur : une chaine de caractères -> une chaine de caractères
  2. ("" ) -> "";
  3. (e::sequence) -> si e = "caca" alors Recur(sequence);
  4.                  sinon e::Recur(sequence);
  5. // PS : Au diable les espaces pour le moment.


 
Bref, comme je l'ai dit, j'ai modifié ma fonction pour tenter de la faire fonctionner un minimum :  
 

Code :
  1. // Elle ressemble comme deux gouttes d'eau à la fonction que j'ai trouvé sur Internet...
  2. // Elle se charge de réafficher mot par mot le texte passé en paramettre.  
  3. function Recur($texte="" )
  4. {
  5. echo PremierMot($texte)." ";
  6. $texte=LaFin($texte);
  7. if($texte != "" )
  8. {
  9. Recur($texte);
  10. }
  11. }


 
Et bien figurez-vous que cette fonction ne marche pas !!  
Et quand je dis que mes fonctions ne marchent pas, ce n'est pas qu'elles me causent une erreur : en fait, c'est comme si ça rechargeait la dernière bonne page valide.. Ca recharge la page précédente en fait...  
 
Donc si vous pouviez m'aider, ça serait très sympa ! j'ai vraiment envie et besoins de faire des fonctions récursives en php, même si c'est lourd.  
Merci par avance !


Message édité par Docteur_Cube le 03-07-2005 à 19:00:00
Reply

Marsh Posté le 03-07-2005 à 18:46:57   

Reply

Marsh Posté le 03-07-2005 à 19:10:02    

[cite]
// Cette fonction récursive est censée prendre un texte en paramettre, et supprimer toutes les occurences du mot "caca". Elle doit donc renvoyer un texte sans aucun mot "caca".  
[/cite]
Ce n'est pas le genre de probleme a apprehender avec de la recursivite ... il y a des problemes qui se pretent tout a fait a la recursivite ... pas cuila !

Reply

Marsh Posté le 03-07-2005 à 19:15:19    

Mais ce n'est pas vraiment la question... Pour ma fonction modifiée, à part le type des variables, je ne vois pas de différence avec la fonction que j'ai trouvé sur Internet avec l'affichage de la liste de nombres.. C'est une fonction que je suis capable de faire en CAML très facilement..
Pourquoi ça marche avec les entiers, et pas avec les chaines de caractères ?  
 
Je sais bien qu'il existe déjà des fonctions pour remplacer toutes les occurences du mot "caca" dans un texte. Mais ce que je veux, c'est savoir pourquoi mes fonctions récursives ne marchent pas.. Peut être qu'il y a quelque chose que je ne fais pas correctement.. J'ai besoins d'utiliser les fonctions récursives pour d'autres fonctions, mais je veux d'abord savoir faire des fonctions simples comme celles-ci...  
 

Reply

Marsh Posté le 03-07-2005 à 19:20:31    

Allez savoir pourquoi, j'ai refais ma fonction factorielle, et elle marche !  

Code :
  1. function factorielle($n=0)
  2. {
  3. if($n == 0) return 1;
  4. else return $n*factorielle($n-1);
  5. }


 
Je sens que ma chance reviens.. Je vais refaire ma fonction pour enlever les caca, et avec un peu de chance, elle marchera !!

Reply

Marsh Posté le 03-07-2005 à 19:23:15    

Resoudre un probleme ABSOLUMENT PAS recursif par un algo recursif n'est pas quelque chose de forcement simple.
 
Bon dans ton exemple c marrant parce que dans la fonction Recur

Code :
  1. function Recur($texte) 
  2.     if($texte == "" ) return ""; 
  3.     else   
  4.         { 
  5.             if(PremierMot($texte) == "caca" ) return Recur(LaFin($texte)); 
  6.             else return PremierMot($texte).Recur(LaFin($texte)); 
  7.         } 
  8. }


Si le 1er mot a traiter n'est pas "caca" .... tu retraites la meme phrase ... qui n'a pas plus de chance de contenir "caca" au 2eme tour ...
 
Edit: J'ai rien dit ... je me suis perdu en lisant ton source.


Message édité par afbilou le 03-07-2005 à 19:28:24
Reply

Marsh Posté le 03-07-2005 à 19:37:47    

lol c'est vrai que ce n'est pas très clair ces imbriquement de fonctions.  
Hmm je ne sais pas pourquoi, mais tout a l'air de marcher un peu mieux qu'avant...  
Maintenant j'arrive à faire fonctionner quelques morceaux de ma fonction... Mais c'est laborieux quand même..  
 
Merci pourt on aide en tout cas !


Message édité par Docteur_Cube le 03-07-2005 à 19:37:55
Reply

Marsh Posté le 03-07-2005 à 20:04:03    

3 conseils :
1. Commence par le cas le plus simple : celui où il n'y aura pas de récursivité, ce qui conduit à
2. TOUJOURS avoir un retour pour une fonction récursive, même quand à priori ça sert à rien, php a parfois des comportements étranges quand le return n'est pas clairement précisé
3. pitié, zappe moi ce

Code :
  1. if($texte == "" ) return "";

pour un

Code :
  1. if($texte == "" ) return false;

, ça évite un parsing inutile dans ta fonction Recur() :)

Reply

Marsh Posté le 04-07-2005 à 10:34:03    

Hmm je ne pensais pas que c'était équivalent de retourner un false.. C'est un booléen, pas un string..  
 
Hmm j'en ai marre, j'ai modifié un petit peu ma fonction, mais elle ne marche toujours pas...
 

Code :
  1. // Supprime les occurences de $mot dans $texte.  
  2. function SupprimerMot($texte="",$mot="" )
  3. {
  4. if($texte=="" ) return false; // Cas de base sans appel récursif.  
  5. else
  6.  {
  7.   if(SupprimerPremiersEspaces(PremierMot($texte)) == $mot) return
  8. SupprimerMot(SupprimerPremiersEspaces(LaFin($texte))); // 1er cas récursif.  
  9.   else return
  10. PremierMot($texte)." ".SupprimerMot(SupprimerPremiersEspaces(LaFin($texte))); // 2ème cas récursif.  
  11.  }
  12. }


 
C'est incroyable que ça ne marche pas ! Ma fonction est quand même correcte...


Message édité par Docteur_Cube le 04-07-2005 à 10:35:28
Reply

Marsh Posté le 04-07-2005 à 10:54:39    

afbilou a écrit :

Ce n'est pas le genre de probleme a apprehender avec de la recursivite

+1
 

Docteur_Cube a écrit :

Hmm j'en ai marre, j'ai modifié un petit peu ma fonction, mais elle ne marche toujours pas...

prend un autre exemple ;)
de plus tu utilises plein de fonctions qui ne sont pas vraiment utiles (ex : TailleTexte, SupprimerPremiersEspaces ...etc, ces fonctions existent déjà en php) et ça ne simplifie pas le debuggage...
 
sinon tu peux me dire pourquoi tu zap le 2eme argument dans tes appels recursifs ???

Reply

Marsh Posté le 04-07-2005 à 11:03:51    

sinon tu peux me dire pourquoi tu zap le 2eme argument dans tes appels recursifs ???


 
+10 !  
 
UUU je n'avais pas vu ça !! I.n.c.r.o.y.a.b.l.e !  
 
C'est vrai pour les fonctions intermédiaires, mais j'aime bien utiliser mes fonctions, avec mes noms. C'est plus simple pour moi.. Par exemple pour obtenir la taille d'un texte, j'ai crée la fonction TailleTexte, qui ne fait qu'appeler la fonction strlen (il me semble).. Toutes ces fonctions sont simples, et je sais qu'elles marchent. Je peux donc faire abstraction de comment elles marchent. Et je les ai refait pour m'entrainer aussi.. Ici ce sont juste des fonctions pour essayer php, et ça ne correspond pas à un projet concret. Mais j'ai besoin de savoir utiliser les fonctions récursives pour un projet important..
 
Ce n'est pas le genre de problème à traiter avec la récursivité ? Mais alors pourquoi je n'ai fait que des trucs comme ça en CAML pendant un semestre ?


Message édité par Docteur_Cube le 04-07-2005 à 11:04:39
Reply

Marsh Posté le 04-07-2005 à 11:03:51   

Reply

Marsh Posté le 04-07-2005 à 11:55:20    

Docteur_Cube a écrit :

Mais alors pourquoi je n'ai fait que des trucs comme ça en CAML pendant un semestre ?


parce que les profs sont en général de mauvais développeurs :whistle: (supprimer un mot dans une chaine se fait en une seule ligne en php, pas besoin de recursivité), un meilleur exemple aurait pu être de lister le contenu d'un dossier et de ses sous-dossiers

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed