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

Langage PHP Discussion :

function recursive et PB de return


Sujet :

Langage PHP

  1. #1
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut function recursive et PB de return
    Salut,

    Cette fonction qui reçoit comme argument une chaîne, supprime toutes les sous chaîne de contenant plus de 1 'A' consécutif (à l'usage je supprimerai les espaces).
    Malheureusement, la recursion fonction et s'arrête comme il faut , mais le retour PAS !

    C'est surement trivial, mais je ne comprends pas et le nombre d'articles à ce sujet sur le net n'est pas énorme, pourtant la récursivité c'est bien pratique.

    Voici mon code (je sais on "élève brouillon peut mieux faire )

    Merci d'avance
    Riete
    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
     
    <?php
    //*******************************
    // locate char A
    //*******************************
    function supress_Char($tab, $c, $pos){
     
    	if ($pos == strlen($tab)) return;
     
    	else{
    		// Si le caractere de la position en cours+1 est le caractere recherche
    		// le +1 c'est pour en garder 1 sinon avec $pos on les enleves tous
    		if (substr($tab, $pos+1, 1) == $c){
     
    			$tab = substr($tab, 0, $pos).substr($tab, $pos+1, strlen($tab)-$pos);
    			echo $pos." ".$tab."<br>";
    			supress_Char($tab, $c, $pos);
    		}
    		else{
    			++$pos;
    			supress_Char($tab, $c, $pos);
    		}
    	}
    }
     
    // Main program
    $s = "azertyAAAAAAAAAAAAAAAAAAwxcvbnAAAfghjd";
     
    	print $s."<br>";
     
    	$s = supress_Char($s, 'A', 0);
     
    	print "<br>".$s;
    ?>

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Je m'embete pas a analyser ton code, car la réponse saute au yeux...
    Comment veux tu avoir un code de retour la dedans sachant que t'as 3 cas de sorti, et qu'aucun d'eux ne retourne quoique ce soit...

    et on dit "récursivité", pas "récursion"

  3. #3
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    A mon sens, ici, utiliser la récursion n'est pas indiqué (sauf si c'est un cas d'école pour apprendre).
    Le plus pratique/rapide est d'utiliser preg_replace ou a la rigueur de parser ta chaine carcarctère par caractère et supprimer les suites de A.

    --
    Rakken

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    function VireLesA($chaine)
    {
        $new_chaine = str_replace('AA', 'A', $chaine);
        if($new_chaine == $chaine) // test variable selon version de PHP
            return $new_chaine;
        else
            return VireLesA($new_chaine);
    }

  5. #5
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Ah oué, sympa la récursive avec str_replace ^_^

    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
     
    function delMulChar($str, $char) {
    	$i = 0;
    	$j = 0;
    	$ret_str = '';
    	$save_char = '';
    	while ($str[$i]) {
    		if ($str[$i] != $char) {
    			$ret_str .= $str[$i];	
    		} else {
    			$j = 0;
    			while ($str[$i + $j] == $char)
    				$j++;
    			if ($j > 1)
    				$i += $j - 1;
    			else
    				$ret_str .= $str[$i];	
    		}
    		$i++;
    	}
    	return $ret_str;
    }
     
    echo delMulChar('azertyaaaaaatyatyaaatya <br />', 'a');
    --
    Rakken

  6. #6
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    On va dire que c'est un cas d'école car expliquer en détail serait long. Disons que je cherche à joindre l'utile à l'agréable.
    Apprendre et comprendre les mécanismes de la RECURSIVITE pour l'utiliser plus souvent.

    Pour répondre à Gloupi, il me semble que je n'ai qu'un cas de sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($pos == strlen($tab)) return;
    J'ai essayé ceci et ca fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($pos == strlen($tab)) return $tab;
    merci

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Bé l'interet du récursif, c'est qu'au lieu de faire une boucle et d'appliquer le traitement autant de fois qu'il le faut dans ta boucle, tu appel une fonction qui fait le meme traitement que dans ta boucle, et t'appel cette fonction autant de fois qu'il le faut (en lui passant en paramètre le résultat d'un seul traitement).
    Il faut donc pensé une fois le traitement terminé à faire remonter ton résultat.
    En l'occurence, tu n'avais pas de return (return; = pas de return !!! si tu mets pas de param a return, c'est juste une instruction pour arreter le traitement).
    Met tois en tete que la 1er fonction que tu lance est la derniere à se finir, car elle attend le résultat de la fonction que tu as lancé à l'intérieur etc...

  8. #8
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut [Résolu] PB Récursivité et retour
    Je dépose ici mon code pour aider ceux qui comme moi peinent à comprendre la récursivité. Maintenant il tourne bien et cette fonction peut être utilisée pour de multiples usages. Je la trouve bien plus lisible que d'autre fonctions de type itératif.
    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
     
    <?php
    //----------------------------------------------------
    // Le arguments de la fonction
    // $tab => La chaîne a traiter
    // $c => Le caractere a rechercher et a supprimer
    // $pos => La position de depart dans la chaine
    //----------------------------------------------------
    function supress_Char($tab, $c, $pos){
     
    	if ($pos == strlen($tab)) return $tab;
     
    	else{
    		// Si le caractere de la position en cours+1 est le caractere recherche
    		// le +1 c'est pour en garder 1 sinon avec $pos en les enleves tous
    		if (substr($tab, $pos+1, 1) == $c){
     
    			$tab = substr($tab, 0, $pos).substr($tab, $pos+1, strlen($tab)-$pos);
    			echo $pos." ".$tab."<br>";
    			return supress_Char($tab, $c, $pos);
    		}
    		else{
    			++$pos;
    			return supress_Char($tab, $c, $pos);
    		}
    	}
    }
     
    // Main program
    $s = "azertyAAAAAAAAAAAAAAAAAAwxcvbnAAAfghjd";
     
    	print $s."<br>";
     
    	$a = supress_Char($s, 'A', 0);
     
    	print "<br>".$a."!!!";
    ?>

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    rajoute en commentaire a quoi correspondent les parametres de ta fonctions ! (et RESOLU)

  10. #10
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Voilà chef !!! c'est commenté

    Pour le bouton résolu, je n'avais pas vu merci Je croyais devoir mettre une balise

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

Discussions similaires

  1. Function sans Return
    Par Danyel dans le forum VB.NET
    Réponses: 5
    Dernier message: 02/05/2008, 18h10
  2. [Vb.Net] - Function - RETURN
    Par Claude Robin dans le forum Windows Forms
    Réponses: 10
    Dernier message: 29/11/2007, 20h58
  3. [Système] function return echo
    Par marie4449 dans le forum Langage
    Réponses: 8
    Dernier message: 16/04/2007, 17h46
  4. function return invalid
    Par stela86 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/06/2006, 17h26
  5. [VB]Erreur: Function must return variant
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/02/2006, 13h23

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