Probleme de récursivité

ketluts Messages postés 2 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 6 avril 2009 - 6 avril 2009 à 23:04
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 7 avril 2009 à 05:51
Bonjour à tous, voilà je me suis amusé à créer un générateur de labyrinthe et ayant vu qu'un défi avait eu lieu justement sur ce forum il y a maintenant plusieurs mois je me suis dit qu'on pourrait peut-être m'aider0
Le probleme est le suivant, le code genere bien des labyrinthe et rapidement cependant au delà d'une taille de 60*60 environ (quelque fois même à partir de 58*58) mon serveur Apache redemarre. Dans le fichier Apache error log j'ai les messages suivants:

[Mon Apr 06 19:38:05 2009] [notice] Parent: child process exited with status 3221225725 -- Restarting.
[Mon Apr 06 19:38:10 2009] [notice] Apache/2.2.11 (Win32) PHP/5.2.8 configured -- resuming normal operations
[Mon Apr 06 19:38:10 2009] [notice] Server built: Dec 10 2008 00:10:06
[Mon Apr 06 19:38:10 2009] [notice] Parent: Created child process 3244
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Child process is running
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Acquired the start mutex.
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Starting 64 worker threads.
[Mon Apr 06 19:38:11 2009] [notice] Child 3244: Starting thread to listen on port 80.

Il me semble que c'est un probleme de récursivité dans mon programme (comme si le serveur considérais que mes boucles etaient infinies et donc plante et redemarre) enfin c'est juste une supposition.

Voila le code en question :



<?php 
//phpinfo();
function getTime() {
    static $timer = false, $start;
    if ($timer === false) {
        $start = array_sum(explode(' ',microtime()));
        $timer = true;
        return NULL;
    } else {
        $timer = false;
        $end = array_sum(explode(' ',microtime()));
        return round(($end - $start) * 1000, 3);
    }
}
getTime();

if(!isset($_POST['largeur']) OR !isset($_POST['hauteur'])){
echo"<form method="" action=""?>
<label for="\&quot;largeur\&quot;">Largeur : </label>

<label for="\&quot;hauteur\&quot;">Hauteur : </label>

";


 exit;}else{
 $largeur=$_POST['largeur']; 
$hauteur=$_POST['hauteur'];
 echo"<form method="\&quot;post\&quot;" action="\&quot;generation.php\&quot;">
<label for="\&quot;largeur\&quot;">Largeur : </label>

<label for="\&quot;hauteur\&quot;">Hauteur : </label>

</form>";}
$nbpi=$largeur*$hauteur; 
$liste=NULL;
$coord=NULL;




//PREPARATION DES BORDS DU PLAN : DEBUT

for($i=0;$i <= $nbpi-1;$i++) 
     {
$check_pi[$i][0]=$i+1;
$check_pi[$i][1]=0; 
 $piece[$i][0]=$i+1;
 $piece[$i][1]=1;
 $piece[$i][2]=1;
 $piece[$i][3]=1;
 $piece[$i][4]=1;
$liste[$i]=$piece[$i];	 
}
 
 
for($i=0;$i <= $largeur-1;$i++) 
     { 
$liste[$i][2]=2;
$j=$nbpi-$i-1;
$liste[$j][1]=2;	
  }	 


for($i=0;$i <= $hauteur-1;$i++) 
     { 
 $k=$largeur*$i;
$liste[$k][4]=2;
 $j=$largeur-1+$largeur*$i;
$liste[$j][3]=2;	 
  }	
 
//PREPARATION DES BORDS DU PLAN : FIN


//FONCTION POUR MELANGER UNE LISTE : DEBUT

function rand_liste($liste,$newliste){
$n=count($liste);
$m=count($newliste);

if($n>0){
$alea=rand(0,$n-1);
$newliste[$m]=$liste[$alea];
$az=0;
for($d=0;$d <= $n-1;$d++) 
    { 
if($d==$alea){}
else{$liste2[$az]=$liste[$d]; $az=$az+1;}
}

if(isset($liste2)){
$newliste=rand_liste($liste2,$newliste);
}
else{$liste2=NULL; $newliste=rand_liste($liste2,$newliste);}
}
else{return $newliste;}

return $newliste;
}

//FONCTION POUR MELANGER UNE LISTE : FIN	


//FONCTION DE GENERATION DU LABYRINTHE : DEBUT	
function generation($pi){
global $check_pi, $largeur;
global $liste;

$check_pi[$pi-1][1]=1;

if($pi!="k") 
    {




//CREER LA LISTE DES PIECES POSSIBLES 
$coord[0][1]=$pi+$largeur;
$coord[0][2]="a";
$coord[1][1]=$pi-$largeur;
$coord[1][2]="b";
$coord[2][1]=$pi+1;
$coord[2][2]="d";
$coord[3][1]=$pi-1;
$coord[3][2]="g";

$g=0;
  
for($i=0;$i <= 3;$i++) 
{ 
$ok1=0;
$ok2=0;


if($liste[$pi-1][$i+1]==1){$ok2=1;

if($check_pi[$coord[$i][1]-1][1]!=1){$ok1=1;}
else{}

}
else{}


if($ok1==1 AND $ok2==1){
if($i==0){
$liste_coord[$g][1]=$pi+$largeur;
$liste_coord[$g][2]="a";
}
elseif($i==1){
$liste_coord[$g][1]=$pi-$largeur;
$liste_coord[$g][2]="b";
}
elseif($i==2){
$liste_coord[$g][1]=$pi+1;
$liste_coord[$g][2]="d";
}
elseif($i==3){
$liste_coord[$g][1]=$pi-1;
$liste_coord[$g][2]="g";
}
$g=$g+1;
}
else{}
}	
unset($ok1,$ok2,$coord,$g);
if(isset($liste_coord)){}
else{$liste_coord=NULL; $check_pi[$pi-1][1]=1;}

if($liste_coord!=NULL){
$liste_coord=rand_liste($liste_coord,NULL);
$nn=count($liste_coord);}
else{}

if(!isset($nn)){$check_pi[$pi-1][1]=1; return;}
else{
for($k=0;$k <= $nn-1;$k++) 
{

if($check_pi[$liste_coord[$k][1]-1][1]!=1){
if($liste_coord[$k][2]=="a"){$liste[$pi-1][1]=3; $liste[$liste_coord[$k][1]-1][2]=3;}
elseif($liste_coord[$k][2]=="b"){$liste[$pi-1][2]=3; $liste[$liste_coord[$k][1]-1][1]=3;}
elseif($liste_coord[$k][2]=="d"){$liste[$pi-1][3]=3; $liste[$liste_coord[$k][1]-1][4]=3;}
elseif($liste_coord[$k][2]=="g"){$liste[$pi-1][4]=3; $liste[$liste_coord[$k][1]-1][3]=3;}	
else{$liste_coord[$k][1]="k"; $check_pi[$pi-1][1]=1;}


generation($liste_coord[$k][1]);

}else{}
}


}
}
else{return;}

return;
}
//FONCTION DE GENERATION DU LABYRINTHE : FIN	



$pi=rand(1,$nbpi); // ON CHOISIT UNE PIECE AU HAZARD POUR DEBUTER LA GENERATION
generation($pi); // ON GENERE LE LABYRINTHE

 

 
//AFFICHAGE DU LABYRINTHE : DEBUT		 
echo"Labyrinthe de $nbpi pièces :
\";
$i=1;
$j=1;

for($c=1; $c<=$nbpi; $c++){
$case=$nbpi-($i*$largeur)+$j;
$mot=$liste[$case-1];

$m0=$mot[0];
$m1=$mot[1];
$m2=$mot[2];
$m3=$mot[3];
$m4=$mot[4];
if($case==1){$m4=3;}else{}
if($case==$nbpi){$m3=3;}else{}
if($m1!=3){$m1=\"1px solid black;\";}else{$m1=\"none\";}
if($m2!=3){$m2=\"1px solid black;\";}else{$m2=\"none\";}
if($m3!=3){$m3=\"1px solid black;\";}else{$m3=\"none\";}
if($m4!=3){$m4=\"1px solid black;\";}else{$m4=\"none\";}
echo\" , \";

if($c%$largeur==0){echo\"----
\"; $i=$i+1; $j=1;}else{ $j=$j+1;}

}

echo"
";	 
echo "Génération en ".getTime()/1000,' s';
//AFFICHAGE DU LABYRINTHE : FIN			 
 
?>



Merci d'avance pour votre aide.

2 réponses

ketluts Messages postés 2 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 6 avril 2009
6 avril 2009 à 23:05
Arf je pensait pas que la mise en page du message allait être comme ça...
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
7 avril 2009 à 05:51
Salut,

En général la mise en forme ne se remet pas toute seule :)
Est ce possible d'avoir un code lisible ?

Cordialement,

Kohntark -
0
Rejoignez-nous