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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| //Fonction recursive de générer les différentes combinaisons pour
// un nombre de critère données ayant différentes valeurs possibles
// nCriter est le critère en cour d'utilisation
// nAvantDernier_criter represente le dernier critère du modèle courant
// nDepart est l'indice du critère courant
// nNbreCrit represente le nombre de critère sur lesquels l'on travail
// arTab est la table de table dont on souhaite combiner les éléments
function setCombinaison_suffixe(nCriter, nAvantDernier_criter, nDepart, nNbreCriter, arTab)
{
var testTour = false;
if (nNbreOperation == nNbreCombinaison)
return;
for (nVal_cour = nDepart; nVal_cour < arTab[nCriter].length; nVal_cour++)
{
if (nCriter == nNbreCriter - 1)
{
strSuffixe = strSuffixe + strModele.split('|').join("") + arTab[nCriter][nVal_cour] + '|';
nNbreOperation += 1;
}
else
{
strModele += arTab[nCriter][nVal_cour] + '|';
arSituationTotal[nCriter] = nVal_cour;
}
//On vérifie si on est au dernier indice du dernier critère
if ((nVal_cour == arTab[nCriter].length - 1) && (nCriter == nNbreCriter - 1))
{
var strModeleTemp = '';
for (var i = 0; i < strModele.split('|').length - 2; i++)
{
strModeleTemp += strModele.split('|')[i] + '|';
}
strModele = strModeleTemp;
nNivo_Dec_positionVal = arSituationTotal[nAvantDernier_criter] + 1;
if ((nNivo_Dec_positionVal > arTab[nAvantDernier_criter].length - 1))
{
if ((arSituationTotal[nAvantDernier_criter + 1] == arTab[nAvantDernier_criter + 1].length - 1) || (nAvantDernier_criter + 1 == nNbreCriter - 1))
{
nAvantDernier_criter -= 1;
if (nAvantDernier_criter > -1)
{
var strPosition = '';
for (var nCompteur = nNbreCriter - 2; nCompteur > 0; nCompteur --)
{
if (arSituationTotal[nCompteur] == arTab[nCompteur].length - 1)
{
strModeleTemp = '';
for (var i = 0; i < strModele.split('|').length - 2; i++)
{
strModeleTemp += strModele.split('|')[i] + '|';
}
strModele = strModeleTemp;
}
else
{
break;
}
}
nNivo_Dec_positionVal = arSituationTotal[nAvantDernier_criter] + 1;
}
else
{
nNivo_Dec_positionVal = arSituationTotal[1] + 1;
nAvantDernier_criter = 0;
}
nCriter = nAvantDernier_criter - 1;
}
else
{
nNivo_Dec_positionVal = arSituationTotal[nAvantDernier_criter + 1] + 1;
nCriter = nAvantDernier_criter;
testTour = true;
}
}
else if (nAvantDernier_criter > -1)
{
nCriter = nAvantDernier_criter - 1;
}
if ((arSituationTotal[0] > 0) && arSituationTotal[nNbreCriter - 2] == 0)
{
nAvantDernier_criter = nNbreCriter - 2;
nCriter = nAvantDernier_criter - 1;
}
// condition de sortie
var bSortie = true;
for (var i = 0; i < nNbreCriter - 2; i++)
{
if (arSituationTotal[i] != arTab[i].length - 1) {
bSortie = false;
break;
}
}
if ((bSortie == true) && (arSituationTotal[nNbreCriter -2] == arTab[nNbreCriter -2].length -1))
return;
}
if (nCriter < nNbreCriter - 1)
{
// si nous sommes sur l'avant dernier critère
if (testTour) {
testTour = false;
setCombinaison_suffixe(nCriter + 1, nAvantDernier_criter, nNivo_Dec_positionVal, nNbreCriter, arTab);
}
if (nCriter + 1 == nAvantDernier_criter) {
if ((nAvantDernier_criter == 0) && (arSituationTotal[0] != 0)) {
nCriter = 0;
}
// on passe au critère intermediaire
setCombinaison_suffixe(nCriter + 1, nAvantDernier_criter, nNivo_Dec_positionVal, nNbreCriter, arTab);
}
else { // on passe sur le dernier critère
setCombinaison_suffixe(nCriter + 1, nAvantDernier_criter, 0, nNbreCriter,arTab);
}
}
// Condition de sortie
if (nNbreCombinaison == nNbreOperation)
break;
}
return;
} |
Partager