8797 sujets

Développement web côté serveur, CMS

Bonjour,


J'ai une question à propos des fonctions récursives en php.

J'ai voulu faire une fonction récursive et il m'est arrivé que la page ne se charge même plus (boucle infinie ?) et affiche "aucune donnée" ou "page introuvable"...

Ou cela m'affiche une page blanche si la variable n'est pas static... bref

Maintenant j'ai mis ça :

<?php
function test($nombre)
{
	echo $nombre++;
	
	if ($nombre < 5)
	{
		test($nombre);
	}
}

test(0);
?>


et ça marche... mais pourquoi si je mets ça :


<?php
function test($nombre)
{
	$nombre = $nombre++;
	
	if ($nombre < 5)
	{
		test($nombre);
	}
}

test(0);
?>


là ça ne marche plus et ça m'affiche "Aucune donnée reçue."... C'est pareil non ?


Merci à vous !
Modifié par Crousti2 (11 Jul 2012 - 15:55)

$nombre = 0;
$nombre = $nombre++; // égale à dire 0 = 0
echo $nombre;


Donnera toujours 0. Donc dans ton cas une boucle infinie.

Il fallait faire (au choix) :


function test($nombre)
{
	$nombre++;
	
	if ($nombre < 5)
	{
		test($nombre);
	}
}


Ou bien (version dégueu, mais c'est pour que tu comprennes ton erreur) :


function test($nombre)
{
	$nombre = ++$nombre;
	
	if ($nombre < 5)
	{
		test($nombre);
	}
}

Modifié par jb_gfx (11 Jul 2012 - 16:21)
Salut,


Merci de ta réponse...


mais pourquoi $nombre est toujours égale à zéro ici ?

$nombre = 0;
$nombre = $nombre++; // égale à dire 0 = 0
echo $nombre;


On incrémente $nombre... pour moi ça veut dire :

$nombre vaut $nombre (donc 0) incrémenté de 1, donc 1... oO


EDIT : c'est bon j'ai compris grace à ceci :


++$a Pre-incrémente Incrémente $a de 1, puis retourne $a.
$a++ Post-incrémente Retourne $a, puis incrémente $a de 1.
--$a Pré-décrémente Décrémente $a de 1, puis retourne $a.
$a-- Post-décrémente Retourne $a, puis décrémente $a de 1.
Modifié par Crousti2 (11 Jul 2012 - 16:59)
salut...
euh JB t'as fumé la moquette ???


$nombre = 0;
$nombre = $nombre++; // égale à dire 0 = 0
echo $nombre;

$nombre = 1 !!

l'erreur de ton code Crousti c'est que tu fais echo $nombre++;

donc tu renvoi à la sortie $nombre++;

mais tu ne fais pas $nombre++ !!

là en revanche JB dis vrai sur ses soluces Smiley cligne
Oui j'ai compris il faudrait faire soit

$nombre++;
puis
echo $nombre;

ou

echo ++$nombre;



Sinon pour le code :

$nombre = 0;
$nombre = $nombre++; // égale à dire 0 = 0
echo $nombre;

$nombre renvoie bien 0 !
Modifié par Crousti2 (11 Jul 2012 - 17:04)
Non, parce que $i++ évalue la variable puis l'incrémente, ++$i incrémente la variable puis l'évalue.

Si tu le fais avec 2 variables séparées tu comprendra mieux :


$i = 0;
$j = 0;

$i = $j++; // $i (0) = $j (0), puis incrémente $j

echo $i; // 0
echo $j; // 1

Modifié par jb_gfx (11 Jul 2012 - 17:12)
pchlj a écrit :

euh JB t'as fumé la moquette ???


Je t'invite à tester mon dernier exemple (post précédent).

pchlj a écrit :

$nombre = 0;
$nombre = $nombre++; // égale à dire 0 = 0
echo $nombre;

$nombre = 1 !!


Non, nombre = 0. Teste le tu verra bien.
Modifié par jb_gfx (11 Jul 2012 - 17:14)
j'avais pas testé !!

j'avoue... c'est totalement illogique... mais ça fait bien 0 !!

Bon en même temps il n'ya aucun intérêt à cette écriture on ne fait jamais $nombre=$nombre++;
Modérateur
En JS, j'ai eu des petits soucis de :

variable++


Maintenant, j'écris comme ceci en règle générale :

variable += 1;


Que ce soit en PHP ou JS, je fais comme ceci maintenant pour avoir le même résultat. En plus avec la dernière écriture, vu que je suis un peu féniasse sur les bords, on peut changer l'ajout par autre chose ou encore mieux le factoriser dans une autre var :

uneVariable = 1;
uneAutreVariable += uneVariable;


Après chacun à sa facon d'écrire.

@crouti : Attention quand tu fais une récursive. Il faut bien se faire un plan d'action avant d'élaborer une tel fonction. Sinon, paye ta récursivité infinie. Si ta fonction est bien construite, ça te fais gagner un temps énorme et ainsi passer à la suite de ton code.
Modifié par niuxe (11 Jul 2012 - 22:31)
pchlj a écrit :

j'avoue... c'est totalement illogique... mais ça fait bien 0 !!


Au contraire c'est parfaitement logique. Smiley smile

pchlj a écrit :

Bon en même temps il n'ya aucun intérêt à cette écriture on ne fait jamais $nombre=$nombre++;


On est d'accord. Smiley smile