J'ai un scénario pour obtenir une sortie comme celle-ci.
value1 = 2, value2 = 2, value3 = 2;
my function () {
for(var i = 0; i<this.value1; i++) {
for(var j = 0; j < this.value2; j++) {
for(var k = 0; k < this.value3; k++) {
console.log(i,j,k);
}
}
}
}
Quand l'entrée est 3, cela donnerait 8 combinaisons comme ci-dessus. Si l'entrée est 4, il y aurait 16 combinaisons. Je peux y parvenir en utilisant la boucle imbriquée for comme ci-dessous.
0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1
C'est bien si c'est pour l'entrée 3, mais je dois obtenir la sortie pour l'entrée 10. Donc J'ai besoin d'écrire 10 boucles for imbriquées comme ci-dessus. Je sais que c'est une mauvaise pratique, je ne sais pas comment utiliser le récursif ici. Veuillez m'aider à ce sujet.
5 Réponses :
Voici une fonction récursive qui peut faire le travail requis.
function solveUtil(limits, index, cur) {
if (index === limits.length) {
console.log(cur.join(' '));
} else {
for (let i = 0; i < limits[index]; i++) {
cur.push(i);
solveUtil(limits, index + 1, cur);
cur.pop();
}
}
}
function solve(limits) {
solveUtil(limits, 0, []);
}
solve(new Array(10).fill(2));
L'approche récursive ressemblerait à ceci:
function recursive(n, range, prefix) {
prefix = prefix || "";
if (n == 0)
console.log(prefix);
else
for (let i = 0; i < range; i++)
recursive(n - 1, range, prefix + " " + i);
}
recursive(10, 2);
Vous pouvez profiter du fait que vous recherchez des combinaisons en binaire et simplement compter à partir de 0 en binaire et ajouter un remplissage.
Cela utilise générateurs de fonctions , mais il est facile de le convertir en une fonction simple.
function * findCombinations(n){
for(let i = 0; i < Math.pow(2, n); i++){
const c = i.toString(2);
const padding = new Array(n - c.length + 1).join('0');
yield padding + c;
}
return null;
}
const iterator = findCombinations(4);
console.log(
Array.from(iterator)
)
Dans les navigateurs plus récents (qui prennent en charge . padStart ), ce qui suit produit la sortie souhaitée (mais contourne plutôt que résout le problème de récursivité):
let n = 4; //or any other value
Array(Math.pow(2,n)).fill(0).forEach((_,i) => console.log(i.toString(2).padStart(n,'0').split('').join(' ')));
Vous pouvez utiliser un Generator avec function * et prenez la combinaison à la volée.
.as-console-wrapper { max-height: 100% !important; top: 0; }
function* binary(length, array = []) {
if (--length) {
yield* binary(length, [...array, 0]);
yield* binary(length, [...array, 1]);
} else {
yield [...array, 0];
yield [...array, 1];
}
}
[...binary(3)].map(a => console.log(...a));
Utilisez un tableau. Incrémentez l'élément actuel du tableau, quand il atteint la valeur maximale, enroulez-le autour de 0, puis faites de même pour l'élément suivant.
Array (Math.pow (2,4)). fill (0) .forEach ((_, i) => console.log (i.toString (2)));presque produit la sortie souhaitée pour l'entrée 4. Cette approche pourrait être modifiée pour donner la sortie exacte.