SOLUTION LOTO AVEC BOUCLE RECURSIVE

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 14 janv. 2006 à 10:38
syl20dies Messages postés 13 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 29 janvier 2009 - 21 oct. 2008 à 08:27
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35562-solution-loto-avec-boucle-recursive

syl20dies Messages postés 13 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 29 janvier 2009
21 oct. 2008 à 08:27
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;
}
clement1138 Messages postés 52 Date d'inscription mardi 8 février 2011 Statut Membre Dernière intervention 28 juillet 2011
29 mai 2008 à 17:47
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
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
18 janv. 2006 à 01:54
Non parceque moi je me fache sinon ;)

je suis tres tres sensible comme garcon.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
18 janv. 2006 à 00:25
ok
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
18 janv. 2006 à 00:04
//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
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
18 janv. 2006 à 00:00
echo 'Nombre de Solution: '.loto('',1,49,6); // ca doit retourne 13983816

ça va t'afficher quoi ça ? le nombre de solutions non ? je vois rien d'autre dans ta fonction qui affiche autre chose...
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
17 janv. 2006 à 22:56
JE REPETE, JE REPETE ///

Mon code est fait pour afficher les solutions possibles, et non de calculer le nombre de solution possible

J'espere que c'est clair pour tout le monde ;)
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
17 janv. 2006 à 22:48
J ai l impression que vous n avez pas compris le probleme !

Mon code, affiche les combinaisons possible du loto, ou de toute autre combinasion de de X1 a Xx avec Y nombre affichable possible.

Le code de monoceros01, ne fais que calculer le nombre de solution. Essayer d afficher les combinaison possible avec le code de monoceros01, vous verez que ce n est pas possible.

Vous avez tous fait la meme confusion, entre le calcul du nombre de solution possible, facielemt realisable par un simple factule factioriel, et le fais d afficher les solutions possibles.
hackshell Messages postés 12 Date d'inscription jeudi 25 septembre 2003 Statut Membre Dernière intervention 4 janvier 2009
16 janv. 2006 à 20:38
Et les chiffres du LOTTO ou d'EURO MILLIONS...c'est quand que vous les donnez ?... (humour)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
16 janv. 2006 à 18:53
Oh... enfin un intérêt utile à ma classe de bench :D
cs_Isengard Messages postés 83 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 10 février 2006
16 janv. 2006 à 16:33
Euh j'ai eu du mal à comprendre le principe de la fonction (heureusement que je fais des statistiques en maths lol). Tout ça pour dire que pour mettre des commentaires comme ça vaut mieux pas en mettre du tout ! Dire que c'est recursif et que c'est beau c'est bien mais ce serait bien d'expliquer en quoi ça consiste vraiment (pas la recursivité mais comment fonctionne la fonction)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 janv. 2006 à 13:33
Au passage, je n'avais pas noté.
Je mets 5, la moyenne.
- pas moins, parce que ce genre de code pourra être utile, je pense, à certains. Ca part d'une bonne idée.
- pas plus, parce que ce n'est pas génialement codé, puisque l'on peut largement optimiser (la preuve :-) ).
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 janv. 2006 à 13:30
C'est vrai tien...lol.
Bon plus honnête (j'ai viré tout ce qui a trait à la génération des combinaisons sur le code de CyrVB ) :

Monoceros : 6.89029693604E-005
CyrVB : 39.918913126

On remarquera que décidément, faut toujours faire les benches sur beaucoup d'exécution, parce que le temps du code de Monoceros a très légèrement changé ;-) Enfin en l'occurence, vu la différence entre les 2 codes, ce n'est pas très grave ici ;-)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
16 janv. 2006 à 13:19
c'est pas honnête comme benchmark, monoceros ne génère pas les combis :)
monoceros01 Messages postés 420 Date d'inscription vendredi 28 novembre 2003 Statut Membre Dernière intervention 20 mars 2006
16 janv. 2006 à 12:09
^0^ J'sais pas pourquoi, mais là, pour la peine, j'aime bien les benchs tiens! :D
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 janv. 2006 à 10:03
J'ai décidé de faire un bench ;-) (avec la classe de bench de FhX, ceci dit en passant) :
Mooceros : 7.70092010498E-005
CyrVB : 115.388473988

je ne l'ai fait que sur 1 exécution, vu le temps que ça prend déjà...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
15 janv. 2006 à 13:00
merci de m'appuyer, je vais peut-être imprimer cette page pour la faire lire à ma prof de philo, je passerais peut-être moins de temps à faire des sudokus en philo :)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
15 janv. 2006 à 11:21
Qu'elle est la profondeur philosophique associée au fait qu'une récursion soit invoquée dans une boucle? Cela lui confère-t-il une essence supérieur? Quelle est d'ailleurs l'essence d'une récursion? Redéfinissons à nouveaux frais le pourquoi et l'origine de la récursion, chère à nous tous. Quelle propriété supérieure s'attache à une boucle? Comment la boucle peut-elle influer sur le cours de la vie d'une récursion, ainsi que sur son bien-être, son essence en somme.

Accueillez positivement et avec un regard bienveillant (respiciet disait le grand sage!) cette nouvelle question philosophique: la récursion dans une boucle, est-ce, finalement, tellement différent et plus profond? Relève-t-elle du savoir bien gardé des grands Chamanes du Nord, ou est-elle à la portée de tous, même les non initiés?

En tout cas je suis 100% coucou sur ce coup-là.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
14 janv. 2006 à 19:13
Pourquoi ne pas faire une constante :

define('NB_POSSIBILITES_LOTO',13........);

et hop ça c'est torché tu pourras l'avoir dans ton script (bon ok je sors)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
14 janv. 2006 à 18:43
je conclue : un truc récursif pour ça, c'est passer son temps à programmer et non é réfléchir... on peut faire les deux comme le fais monoceros...
monoceros01 Messages postés 420 Date d'inscription vendredi 28 novembre 2003 Statut Membre Dernière intervention 20 mars 2006
14 janv. 2006 à 18:39
<?php
function factoriel($entier)
{
$res = $entier;
for($i=$entier-1;$i>1;$i--)
{
$res *=$i;
}
return $res;
}
function loto($i, $n, $p)
{
// $i= Valeur Minimum (Loto 1)
// $n= Valeur Maximum (Loto 49)
// $p= Nombre de chiffre que la solution doit contenir (Loto 6)

return factoriel($n-$i+1) / (factoriel($n-$i+1-$p) × factoriel($p));
}

echo 'Nombre de Solution: '.loto(1,49,6);
?>

Maintenant explique moi ce que fait ta fonction que ne fait pas la mienne =) (mise a par bouffer de la ressource)
monoceros01 Messages postés 420 Date d'inscription vendredi 28 novembre 2003 Statut Membre Dernière intervention 20 mars 2006
14 janv. 2006 à 18:33
ué c fini
<?php
function factoriel($entier)
{
$res = $entier;
for($i=$entier-1;$i>1;$i--)
{
$res *=$i;
}
return $res;
}
echo factoriel(6);
?>
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
14 janv. 2006 à 18:31
une boucle pour faire une factorielle c'est pas long non, surtout qu'on nous a fait coder ça en java dans les TD je te raconte pas comment on dormait m'enfin bon, faut bien commencer un jour lol
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
14 janv. 2006 à 18:28
@monoceros01: le but de mon truc n est pas de calculer le nombre de resultat possible, du as du te meprendre, mon but est de les affiches, et donc de pouvoir utiliser ces resultats dans d autre fonction!

de plus c est facilemenet adaptable, pour afficher les combinaison avec des chaines, des tableaux, etc ...

Pour cacluler le nombre de resultat un calcule factoriel est bien necessaire c est sur, j ai aussi le code en PHP si tu veux
monoceros01 Messages postés 420 Date d'inscription vendredi 28 novembre 2003 Statut Membre Dernière intervention 20 mars 2006
14 janv. 2006 à 18:25
Argh par contre php calcul po les factoriels v__v (ce qui rend le code ci-dessus faux évidemment :/)
[troll]Faire une fonction qui calcule les factoriels serait déjà plus intéressant et aura plus d'utilité que de calculer les combinaisons du loto :D/troll

Tiens j'vais voir si y en a pas déjà sur CS et pitète en coder un si le coeur m'en dit (c po bien long a faire ¬¬)
monoceros01 Messages postés 420 Date d'inscription vendredi 28 novembre 2003 Statut Membre Dernière intervention 20 mars 2006
14 janv. 2006 à 18:16
Autant pour moi, mon erreur est que les numéros peuvent être dans n'importe quel ordre donc il faut virer toutes les combinaisons identiques dans mon calcul... Je corrige donc avec :

($n-$i+1)! / (($n-$i+1-$p)! × $p!)
Donc dans ton exemple :
(49-1+1)! / (49-1+1-6)! × 6! = 49! / (43! × 6!)
Soit :
(49×48×47×46×45×44) / 720 10 068 347 520 / 720 13 983 816 combinaisons possibles

Ce qui donnerais une fonction du style :

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)
return ($n-$i+1)! / (($n-$i+1-$p)! × $p!);
}

echo 'Nombre de Solution: '.loto('',1,49,6); // ca doit retourne 13983816
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
14 janv. 2006 à 18:01
je vois pas ce qu'il y a de profond là dedans... je connais, utilise et ai codé nombre de fonctions qui utilisent la récursivité... le fait de mettre un code en initié tient au fait que le code soit complexe, gère une tache complexe et soit propre... et non pas juste parce qu'il est récursif... 11 lignes de code récursif ou non y a pas de quoi fouetter un chat... mais bon c'est pas grave... .. . ;o)

@ tchaOo°
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
14 janv. 2006 à 17:59
au fait j ai une question, je n y connais rien de rien en C3 ou C++, ca doit pas etre bien sur a adpater, mais quelqu un pouurait il me poster le code source exacte pour passer ca en C# ou C++, voir meme en VB.NET
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
14 janv. 2006 à 17:56
Kanlrelune, je suis d accord avec toi

Je l ai mis en initie juste a cause de ca, car cest un appel recursive dans une boucle, perso c est as tous les jours que je vois ca. A chaque fois que tu appel la fonction, une boucle rappel cette meme fonction, ca commence a devenir un peu profond

for (;$i <= $n; ++$i) { loto($s." ".$i, $i + 1, $n, $p); }
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
14 janv. 2006 à 17:53
d'accord avec toi CyrVB mais de là à poster cette source en initié juste parce qu'elle est récursive... .. . oÔ

@ tchaOo°
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
14 janv. 2006 à 17:47
http://www.loto-club.com/loto/statistiques/statistiques.htm

Pour en connaitre un peu plus, et pour vous montrez que la taupe est a pres de 14M et non 10M comme le pretant Monoceros01
CyrVB Messages postés 26 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 21 mars 2006
14 janv. 2006 à 17:43
@MONOCEROS01: non tu te trompes le nbr de solution est 13M est des bananes tu peux le verifier sans aucun probleme sur d autres site

@COUCOU747: c est pas un char pour tuer une taupe, mais cest une solution bien plus elegante que
6 boucles imbriquees, imagine que tu veuilles faire des combinaison d un loto de 1 a 49 avec 15 numero. Tu devras donc faire 15 boucle imbriquees, ca n a aucun style !
monoceros01 Messages postés 420 Date d'inscription vendredi 28 novembre 2003 Statut Membre Dernière intervention 20 mars 2006
14 janv. 2006 à 17:38
si je ne m'abuse, la solution c'est :
($n-$i+1)! / ($n-$i+1-$p)!
Donc dans ton exemple :
(49-1+1)! / (49-1+1-6)! = 49!/43!
Soit :
49×48×47×46×45×44 = 10 068 347 520 combinaisons possibles

Voilà la taupe :D
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
14 janv. 2006 à 15:58
Salut,

"tu prends souvent un char pour tuer une taupe ?"

t'es sûr de pas la louper au moins (mdr)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
14 janv. 2006 à 10:38
hem... récursivitée pour ça ???

tu prends souvent un char pour tuer une taupe ?
Rejoignez-nous