begin process at 2010 02 10 14:45:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > SOLUTION LOTO AVEC BOUCLE RECURSIVE

SOLUTION LOTO AVEC BOUCLE RECURSIVE


 Information sur la source

Note :
4,27 / 10 - par 11 personnes
4,27 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :loto, recursive, recursivite Niveau :Initié Date de création :14/01/2006 Vu :13 783

Auteur : CyrVB

Ecrire un message privé
Commentaire sur cette source (35)
Ajouter un commentaire et/ou une note

 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

Source

  • 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
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 ;)


 Sources de la même categorie

Source avec une capture CALCUL DE TVA MARGE AVEC REMISE FOURNISSEUR SPÉCIALE POUR LE... par lcomb
Source avec Zip EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE par TheWeasel47
FONCTION EQUATION LÉGÈRE par ff5
Source avec Zip Source avec une capture TRACEUR DE COURBE EN COORDONNÉES CARTÉSIENNES (MAJ) par fredbonmatin
CONVERTIR LES RÉFÉRENCES DE COLONNE EXCEL DE CHIFFRE EN LETT... par computman007

 Sources en rapport avec celle ci

Source avec Zip SURCHARGE DE LA CLASSE RECURSIVEDIRECTORYITERATOR POUR RÉCUP... par Astalavista
Source avec Zip HASHMAP EN PHP AVEC LA SPL par dorian91
GÉNÉRATEUR DE MENU MULTILANGUE AVEC CONTROLE DU NIVEAU D'ACC... par lilippx

Commentaires et avis

Commentaire de coucou747 le 14/01/2006 10:38:25

hem... récursivitée pour ça ???

tu prends souvent un char pour tuer une taupe ?

Commentaire de Anthomicro le 14/01/2006 15:58:59

Salut,

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

t'es sûr de pas la louper au moins (mdr)

Commentaire de monoceros01 le 14/01/2006 17:38:03

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

Commentaire de CyrVB le 14/01/2006 17:43:26

@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 !

Commentaire de CyrVB le 14/01/2006 17:47:43

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

Commentaire de kankrelune le 14/01/2006 17:53:40

d'accord avec toi CyrVB mais de là à poster cette source en initié juste parce qu'elle est récursive... .. . oÔ

@ tchaOo°

Commentaire de CyrVB le 14/01/2006 17:56:47

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); }

Commentaire de CyrVB le 14/01/2006 17:59:14

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

Commentaire de kankrelune le 14/01/2006 18:01:55

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°

Commentaire de monoceros01 le 14/01/2006 18:16:51

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

Commentaire de monoceros01 le 14/01/2006 18:25:02

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 ¬¬)

Commentaire de CyrVB le 14/01/2006 18:28:26

@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

Commentaire de Anthomicro le 14/01/2006 18:31:59

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

Commentaire de monoceros01 le 14/01/2006 18:33:21

ué c fini
<?php
function factoriel($entier)
{
$res = $entier;
for($i=$entier-1;$i>1;$i--)
{
$res *=$i;
}
return $res;
}
echo factoriel(6);
?>

Commentaire de monoceros01 le 14/01/2006 18:39:11

<?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)

Commentaire de coucou747 le 14/01/2006 18:43:39

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...

Commentaire de Anthomicro le 14/01/2006 19:13:23

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)

Commentaire de Kirua le 15/01/2006 11:21:23

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à.

Commentaire de coucou747 le 15/01/2006 13:00:38

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 :)

Commentaire de malalam le 16/01/2006 10:03:42 administrateur CS

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à...

Commentaire de monoceros01 le 16/01/2006 12:09:59

^0^ J'sais pas pourquoi, mais là, pour la peine, j'aime bien les benchs tiens! :D

Commentaire de Kirua le 16/01/2006 13:19:06

c'est pas honnête comme benchmark, monoceros ne génère pas les combis :)

Commentaire de malalam le 16/01/2006 13:30:44 administrateur CS

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 ;-)

Commentaire de malalam le 16/01/2006 13:33:40 administrateur CS

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 :-) ).

Commentaire de Isengard le 16/01/2006 16:33:21

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)

Commentaire de FhX le 16/01/2006 18:53:53

Oh... enfin un intérêt utile à ma classe de bench :D

Commentaire de hackshell le 16/01/2006 20:38:59

Et les chiffres du LOTTO ou d'EURO MILLIONS...c'est quand que vous les donnez ?... (humour)

Commentaire de CyrVB le 17/01/2006 22:48:42

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.

Commentaire de CyrVB le 17/01/2006 22:56:11

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 ;)

Commentaire de Anthomicro le 18/01/2006 00:00:28

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...

Commentaire de CyrVB le 18/01/2006 00:04:54

//echo $s.'<br>'; // 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

Commentaire de Anthomicro le 18/01/2006 00:25:29

ok

Commentaire de CyrVB le 18/01/2006 01:54:27

Non parceque moi je me fache sinon ;)

je suis tres tres sensible comme garcon.

Commentaire de clement1138 le 29/05/2008 17:47:58

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

Commentaire de syl20dies le 21/10/2008 08:27:55 9/10

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]<arr_in.length-n+i){
       id[i]++;
       exit=true;
    }else{
       fini=(i==0);
       first=true;
       for(cpt=(n-i);cpt>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;
}




 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

boucle pour loto [ par simon0000 ] bonjoir j'ai fait ce code pour avoir tous les nombre possible dans le loto mais ca ne marche pas est ce que quelque un pourait m'aider &lt;? $cs = arr Vérification de tirrage... Help [ par lolyest ] Bonjour, je voudrai faire un jeux de loto.J'ai déja fait le jeux de tirrrage; mais, je ne sait pas comment faire pour après, vallider les gains si on Recursivite sur un fichier [ par PoLoCh ] Bonjour a tous, voila jai un probleme qui me coince depuis 2 jours. Je dois lire un fichier et a partir de ce fichier creer un arbre (sorter tree). Le Excel : Loto [ par ugo26 ] Bonjour, je suis débutant sur excel et je voudrais savoir s'il est possible d'afficher toute les combinaisons du loto à l'aide d'une fonction excel, m


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales