Solution loto avec boucle recursive

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 288 fois - Téléchargée 30 fois

Contenu du snippet

Voila,

Ceci est mon premier et certainement dernier code poste ici.

J'en avais un peu marre de faire 6 boucles imbriquees pour calculer toutes les possibites du loto, donc j ai reflechie un peu au probleme avec un copain, et on a pondu ce code, qui s adapte facilement a n importe quelle parametres.

Si vous avez des combinaison a calculer, c'est relativement pratique.

Ca fait appel a un appel recursif dans un boucle, c est plutot joli je trouve ;)

PS: Vu qu il y a pres de 14 Millions au loto, j'ai mis en commentaire le 'echo' car sinon ca prends vraiment du temps a afficher

Source / Exemple :


function loto($s, $i, $n, $p) 
// $s= String_Resulat
// $i= Valeur Minimum (Loto 1)
// $n= Valeur Maximum (Loto 49)
// $p= Nombre de chiffre que la solution doit contenir (Loto 6)

        {
        static $cpt; // compteur pour le nombre de solution retourne

        if ($p == 0) // On a fini ou pas ? Dans le cas du loto on en a 6 ou pas
            { 
            //echo $s.'<br>'; // On affiche la solution enelever les commentaires
            return ++$cpt;  // Hep !!! garcon un de plus un !!!!
            }

        --$p;

        for (;$i <= $n; ++$i) 
		{ loto($s." ".$i, $i + 1, $n, $p); } // Recursivite dans une boucle !!

        return $cpt;
        }

set_time_limit(0);
echo 'Nombre de Solution: '.loto('',1,49,6); // ca doit retourne 13983816

Conclusion :


J ai mis le code en initie, j'ai failli le mettre en Expert pour la simple raison que le code, n est pas vraiment complique en fait, mais voir une recursivite dans une boucle, c'est pas tous les jours ;)

A voir également

Ajouter un commentaire Commentaires
Messages postés
13
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
29 janvier 2009

Bonjour, conscient que ce source ainsi que la polémique associée commencent à être assez anciens, je ne sais pas si mon désir de soutenir CyrVB rencontrera du répondant, toutefois je tenais à signaler que ce code s'avère pour moi très utile. J'ai récemment été confronté à la problématique de la génération de l'ensemble des solutions d'une combinaison de k éléments parmis n. je tiens à préciser que j'appartiens plus à la catégorie des bidouilleurs du dimanche, et je ne suis donc à ce titre pas très familier de la récursivité. J'ai alors buté sur la problématique de réaliser k boucles imbriquées dans mon appel de fonction.
j'ai ensuite vainement parcouru le net à la recherche de la manière de résoudre ce problème. La seule information que j'ai pu obtenir fut d'aller voir du coté de la récursivité et là encore le meilleur tuto trouvé ne s'employait qu'à mettre sous forme récursive l'utilisation de 2 boucles imbriquées et non k. je suis finalement parvenu en m'arrachant les cheveux à une solution 100% itérative du problème, mais au vu de la dite solution je pense que la simplicité du code de CyrVB(ne justifiant pas pour certains de s'enthousiasmer devant l'emploi de la récursivité dans une boucle) devrait au contraire en faire ressortir les bienfaits.
lors de ma tentative d'apprentissage sur la notion de récursivité, j'ai pu noter que celle-ci avait l'inconvénient de consommer une quantité de mémoire à l'exécution correspondant aux paramètres multipliés par le nombre de récursions. dans le cas présent j'imagine que ce puisse rapidement devenir un problème au vu du nombre faramineux de solutions que l'on peut obtenir dès que k se rapproche de n/2 avec un n élevé.
je me demandais donc si finalement ma solution itérative certes beaucoup plus obscure en terme de lisibilité pouvait tout de même représenter un intérêt.
celle-ci étant codée en action script je ne sais pas si elle trouverait place à cet endroit mais je serais vivement intéressé par la critique de membres éclairés tels qu'il semble que l'on puisse en rencontrer sur phpcs(même s'ils lancent parfois des benchs pour comparer deux programmes ne faisant pas du tout la même chose ;-))de plus ce sont là deux langages orientés web et souvent complémentaires, je tomberais donc peut être sur quelqu'un sachant le traduire en php et/ou l'optimiser en conservant sa nature itérative.
je profite de la confusion sur la destination du programme pour soumettre une suggestion dans le cas du calcul strict du nombre de combinaisons

C(k,n) est mathématiquement = n!/(k!(n-k)! mais si l'on réfléchit un peu, et au vu du soit-disant gain de ressource qu'était censé amener la fonction.j'émettrai une vive critique sur le fait d'appeler trois fois une fonction factorielle sans chercher un peu à simplifier ce quotient en effet il suffit de multiplier uniquement les entiers allant de k à n et de diviser ce résultat par (n-k)! en l'occurence 43! est calculé deux fois pour rien puisqu'ils se simplifient.
ceci donnerait la fonction suivante tellement simple que je vais même la traduire en php:

function loto($k,$n){
//ici le loto mais s'applique en fait à tout calcul de combinaisons de $k elements parmis $n
$tot=1;
for($r=$n;$r>$k;$r--){$tot*=$r;}
for($r=($n-$k);$r>1;$r--){$tot/=$r;}
return($tot);
}
echo 'Nombre de Solution: '.loto(6,49);

ceci étant dit revenons en à notre problématique de génération des solutions:

je l'ai codé ici dans le but de retourner un tableau bidimensionnel contenant toutes les combinaisons possibles de n elements parmis un tableau passé en paramètre ex: combi(["chat","chien","pomme","poire"],2) retourne[["chat","pomme"],["chat","poire"],["chien","pomme"],["chien","poire"],["pomme","poire"]]

function combi(arr_in,n){
comb=[];
fini=false;
id=Array(n);
for(cptid=0;cptid<n;cptid++){id[cptid]=cptid;}
id[n-1]=id[n-1]-1;
while(!fini){
exit=false;
for(i=n-1;i>=0 && !exit;i--){
if(id[i]0;cpt--){
id[n-cpt]=id[(n-1)-cpt]+((first)?2:1);
first=false;
}
}
}
if(!fini){
solution=Array(n);
for(cptid=0;cptid<n;cptid++){solution[cptid]=arr_in[id[cptid]];}
comb.push(solution);
}
}
return comb;
}
Messages postés
52
Date d'inscription
mardi 8 février 2011
Statut
Membre
Dernière intervention
28 juillet 2011

mdr je deterre le code jme fait chier en stage..ben o moin ce code pas tres utile pr ma part m'a bien amusé avec votre discussion pseudo filosofik.....cyrvb tma tué...c un code fache toi pas
Messages postés
26
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
21 mars 2006

Non parceque moi je me fache sinon ;)

je suis tres tres sensible comme garcon.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
ok
Messages postés
26
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
21 mars 2006

//echo $s.'
'; // On affiche la solution enelever les commentaires

Cependant ma fonction retourne aussi le nombre de solution

J4'ai fais un copier/coller de la description, lit le Post Scriptum


Description
Voila,

Ceci est mon premier et certainement dernier code poste ici.

J'en avais un peu marre de faire 6 boucles imbriquees pour calculer toutes les possibites du loto, donc j ai reflechie un peu au probleme avec un copain, et on a pondu ce code, qui s adapte facilement a n importe quelle parametres.

Si vous avez des combinaison a calculer, c'est relativement pratique.

Ca fait appel a un appel recursif dans un boucle, c est plutot joli je trouve ;)

PS: Vu qu il y a pres de 14 Millions au loto, j'ai mis en commentaire le 'echo' car sinon ca prends vraiment du temps a afficher
Afficher les 35 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.