IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

Boucle sur tableau


Sujet :

ActionScript 3

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut Boucle sur tableau
    Bonjours a tous.

    Je galère sévère sur la création d'un boucle pour une addition ....

    Je m'explique:

    J'ai un tableau (de taille max 9) sur une dimension du genre:

    var Liste:Array =new Array(2,4,5); //Pour exemple

    et je veut la liste de toute les possibilité d'addition soit:
    2 + 4 = 6
    2 + 5 = 7
    4 + 5 = 9
    2 + 4 + 5 = 11

    sur un tableau de trois c'est facile, deux boucle imbrique plus l'addition suffisent mais lorsque le tableau possède 9 élément comment faire...

    j'avais commencer par quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    switch (ListeCarteTest.length){
    	case 2:
    		//2 cartes
    		lCart = ListeCarteTest[0];
    		lCart2 = ListeCarteTest[1];
    		lCart3 = ListeCarteTest[2];
    		lVal.push(int(lCart.ValCarte) + int(lCart2.ValCarte));
    		if (lVal[0] == 11){
    			lBoOk = true;
    		}
    		break;
     
    	case 3:
    		//3 cartes;			
    		lCart = ListeCarteTest[0];
    		lCart2 = ListeCarteTest[1];
    		lCart3 = ListeCarteTest[2];
    		lVal.push(int(lCart.ValCarte) + int(lCart2.ValCarte));
    		lVal.push(int(lCart.ValCarte) + int(lCart3.ValCarte));
    		lVal.push(int(lCart2.ValCarte) + int(lCart3.ValCarte));
    		lVal.push(int(lCart.ValCarte) + int(lCart2.ValCarte) + int(lCart3.ValCarte));
    		if (lVal.indexOf(11) != -1){
    			lBoOk = true;
    		}
    		break;
     
    	case 4:
    		//4 cartes;			
    		lCart = ListeCarteTest[0];
    		lCart2 = ListeCarteTest[1];
    		lCart3 = ListeCarteTest[2];
    		lCart4 = ListeCarteTest[3];
    		//Les paire
    		lVal.push(int(lCart.ValCarte) + int(lCart2.ValCarte));
    		lVal.push(int(lCart.ValCarte) + int(lCart3.ValCarte));
    		lVal.push(int(lCart.ValCarte) + int(lCart4.ValCarte));
    		lVal.push(int(lCart2.ValCarte) + int(lCart3.ValCarte));
    		lVal.push(int(lCart2.ValCarte) + int(lCart4.ValCarte));
    		lVal.push(int(lCart3.ValCarte) + int(lCart4.ValCarte));
    		//les triple
    		lVal.push(int(lCart.ValCarte) + int(lCart2.ValCarte) + int(lCart3.ValCarte));
    		lVal.push(int(lCart.ValCarte) + int(lCart3.ValCarte) + int(lCart4.ValCarte));
    		lVal.push(int(lCart2.ValCarte) + int(lCart3.ValCarte) + int(lCart4.ValCarte));
    		//Les quadrplie
    		lVal.push(int(lCart.ValCarte) + int(lCart2.ValCarte) + int(lCart3.ValCarte) + int(lCart4.ValCarte));
    		if (lVal.indexOf(11) != -1){
    			lBoOk = true;
    		}
    		break;
     
    }
    Mais ca devient trop lours ....(Oui, en fait c'est des carte que je manipule mais le principe est le meme )


    Si quelqu'un a une idée merci d'avance

  2. #2
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    salut,

    pas simple, je vois pas de soluce pour le faire sans des 10aines de lignes de code, tu pourrais t'aider des méthodes de Array comme forEach() / filter / map
    avec en prime des boucles + conditions ... bon courage

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut
    Déjà MERCI de la réponse Lorenzo77 !!!!

    Bon alors pas de solution facile .... et ben ca va faire lourd...

    Enfin bon le probleme avec les boucle each c'est que finalement c'est encore plus lours comme code .... (du moins a comprendre en cas d'erreur )
    Enfin je vais faire comme je peut, je mettrais ma solution si il y en a qui sont interréser

    PS: Je suis tout ouïe a de nouvelle proposition

  4. #4
    Membre expérimenté
    Homme Profil pro
    Creative Technologist
    Inscrit en
    Avril 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Creative Technologist

    Informations forums :
    Inscription : Avril 2007
    Messages : 126
    Par défaut
    HOOOOooooo !!
    La vache, ça c'est un beau problème !!

    J'ai pas la place ici d'expliquer dans le détail. C'est un problème d'analyse combinatoire (arangements, combinaisons) à résoudre avec une programmation récursive.
    C'est typique des solutions très simples à écrire, mais très complexes à imaginer, parce que très abstraites.

    Je t'engage à aller lire des docs là-dessus, pour commencer:
    http://fr.wikipedia.org/wiki/Combinatoire
    http://fr.wikipedia.org/wiki/Algorithme_r%C3%A9cursif

    Note que malgré mes tests, j'ai quand même pu me tromper quelque part, et l'algo génère peut-être des erreurs...

    Comme je suis un grand amateur de code succinct, mais que ça aide pas à la compréhension, je te file le code optimisé, puis le code détaillé avec des commentaires.

    Code optimisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    package {
     
         import flash.display.MovieClip;
     
         public class Test_Simple extends MovieClip {
     
              public var tableau:Array = [2, 4, 5, 7];
              public var solution:Array = [];
     
              public function Test_Simple() {
                   recurs(0, tableau.slice())
                   trace("Résultat:"+solution.length+" solutions = "+solution.sort(Array.NUMERIC));
              } // end constructor
     
              public function recurs(aTotal:int, aTableau:Array):void {
                   var subVal:int = aTableau.pop();
                   var subAdd:int = aTotal+subVal;
                   if ( (aTotal>0) && (solution.indexOf(subAdd)==-1) ) solution.push(subAdd);
                   if (aTableau.length==0) return;
                   recurs(aTotal, aTableau.slice());
                   do {
                        subAdd = aTotal+subVal+aTableau.pop();
                        if (solution.indexOf(subAdd)==-1) solution.push(subAdd);
                        if (aTableau.length>0) recurs(subAdd, aTableau.slice());
                   } while (aTableau.length>0)
              } // end recurs
     
         } // end class
    }// end package
    Enjoy !!

  5. #5
    Membre expérimenté
    Homme Profil pro
    Creative Technologist
    Inscrit en
    Avril 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Creative Technologist

    Informations forums :
    Inscription : Avril 2007
    Messages : 126
    Par défaut
    Cette version effectue des traces permettant de suivre le processus.
    Elle a en plus le mérite de te donner les différentes combinaisons possibles pour chaque résultat.

    Quelques notes succinctes: Un algorythme récursif peut être expliqué par une Function() qui s'appelle elle-même (évidemment, un des premiers problèmes à éviter est la boucle sans fin). En ce sens, on considère un "niveau de profondeur", c'est à dire si on appelle la fonction, on dit qu'on est au niveau 0 (ou 1, c'est selon). Si on appelle la fonction qui s'appelle et qui à l'intérieur d'elle-même s'appelle à nouveau, on est à 3 niveaux de récursions, par exemple.
    C'est pour cela que l'algo trace un "niveau".
    J'ai aussi tracé un identifiant par appel récursif, de manière à aider le suivi du traitement.

    Ho ben ça me fait penser qu'il serait bon aussi d'aller se renseigner sur ce qu'on appelle le temps polynomial, pour une bonne intro:
    http://fr.wikipedia.org/wiki/Th%C3%A...s_et_en_espace

    Si tu veux bien, je me garde cet exemple de problème à solution récursive sous le coude pour faire un tuto ou un cours là-dessus.

    Voilà la solution détaillée (mais pas trop, j'ai pas le temps):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    package {
     
    	import flash.display.MovieClip;
     
    	public class Test_Detail extends MovieClip {
     
    		public var solution:Object;
    		public var appelIndex:int = 0;
     
    		public function Test_Detail() {
    			init();
    		} // end constructor
     
    		public function init():void {
    			var tableau:Array = [2, 4, 5, 7];
    			solution = new Object();
     
    			recurs(0, "", tableau, 0, "A");
     
    			trace("Solutions détaillées: ----------------------");
    			var subS:String = "";
    			for (var s:String in solution) subS += s+"["+solution[s]+"], ";
    			trace (subS);
    		} // end init
     
    		public function recurs(aTotal:int, aTotalTxt:String, aTableau:Array, aNiveau:int, aDemandeur:String):void {
    			appelIndex++; // pour bien repérer qui a calculé quoi et généré quel appel
    			var appelNom:String = String.fromCharCode(65+appelIndex);
    			trace(appelNom+", appel de niveau "+aNiveau+", total "+aTotalTxt+"="+aTotal+" reste "+aTableau+" demandé par "+aDemandeur);
     
    			var subA:Array = aTableau.slice(); // effectue une copie du tableau
    			var subVal:int = subA.pop(); // récupère la valeur à traiter et la suprime du tableau
    			trace("   "+appelNom+" prend "+subVal+" reste "+subA);
     
    			var subTxt:String; // pour debug
    			var subAdd:int; // sera le résultat de l'addition
     
    			if (aTotal>0) {
    				// si le total est supérieur à 0, il faut la solution total + la valeur
    				// note: si le total est à 0, c'est nécessairement le premier niveau récursif
    				subAdd = aTotal+subVal;
    				subTxt = (aTotalTxt==""?"":aTotalTxt+"+")+subVal;
    				trace("   "+appelNom+" add: ("+aTotalTxt+")+"+subVal+"="+subAdd+"   reste:"+subA);
    				if (!solution.hasOwnProperty(subAdd)) // si ce total n'a jamais été référencé
    					solution[subAdd] = subTxt; // crée la référence à la solution
    				else
    					solution[subAdd] += ", "+subTxt; // sinon ajoute la solution à la liste précédente
    			}
     
    			if (subA.length>0) {
    				// s'il reste des valeurs,
    				// on effectue total + toutes les valeurs autres que la valeur à traiter
    				// c'est à dire total + une copie du tableau restant
    				recurs(aTotal, aTotalTxt, subA.slice(), aNiveau+1, appelNom);
     
    				var subVal2:int; // sera la valeur à ajouter
     
    				// comme il reste des valeurs,
    				// on effectue total + la valeur + chacune des valeurs restantes
    				do {
    					subVal2 = subA.pop();
    					subAdd = aTotal+subVal+subVal2;
    					subTxt = (aTotalTxt==""?"":aTotalTxt+"+")+subVal+"+"+subVal2;
    					trace("   "+appelNom+" add: ("+aTotalTxt+")+"+subVal+"+"+subVal2+"="+subAdd+"   reste:"+subA);
    					if (!solution.hasOwnProperty(subAdd))
    						solution[subAdd] = subTxt;
    					else
    						solution[subAdd] += ", "+subTxt;
     
    					// enfin, on effectue total + la valeur + les futurs totaux des valeurs restantes
    					if (subA.length>0) recurs(subAdd, subTxt, subA.slice(), aNiveau+1, appelNom);
    				} while (subA.length>0)
    			}
    		} // end recurs
     
     
     
    	} // end class
    }// end package
    Enjoy

  6. #6
    Rédacteur/Modérateur
    Avatar de beekeep
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2 005
    Par défaut
    il y a de bons exemples dans les contributions du forum Algorithmes :

    http://www.developpez.net/forums/d42...-combinaisons/

    http://www.developpez.net/forums/d22...-combinaisons/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Boucles sur tableau à deux dimensions
    Par Slavo dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 08/03/2014, 16h10
  2. Boucle foreach sur tableau devenu inaccessible
    Par Lhtldrn dans le forum C#
    Réponses: 1
    Dernier message: 08/07/2012, 11h23
  3. Boucle sur un tableau de variable en SQL
    Par sekaijin dans le forum Débuter
    Réponses: 4
    Dernier message: 27/01/2010, 20h52
  4. [HTML] boucle sur une variable et non pas un tableau
    Par delma dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/11/2006, 15h03
  5. [Tableaux] Boucle sur un tableau associatif
    Par alexfrere dans le forum Langage
    Réponses: 11
    Dernier message: 28/06/2006, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo