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