Je ne comprends pas la ligne 18? Si l'entrée est 100, comment le programme imprime-t-il d'abord le numéro 1 et se termine par le numéro 100 dans le tableau? Toute aide serait appréciée.
function fizzBuzz(n){
//create empty array called results
//create base case for when n === 1
//recurse and push value to array
var results = [];
if(n === 1){
return [1];
} else {
if(n % 3 === 0 && n % 5 === 0){
results.push('FizzBuzz')
} else if (n % 3 === 0){
results.push('Fizz')
} else if (n % 5 === 0){
results.push('Buzz')
} else {
results.push(n);
}
return fizzBuzz(n - 1).concat(results); // ???
}
}
console.log(fizzBuzz(100));
3 Réponses :
Cette ligne
fizzBuzz(n - 1).concat(results);
pourrait être interprétée comme "ajouter les résultats que nous venons de rassembler pour n aux résultats que nous avons générés pour f (n - 1) . " «Ajouter a à b» signifie «mettre un après b». Pensez à ce que cela ferait pour n == 2 , puis en général.
La première chose à réaliser est que chaque appel à fizzBuzz renvoie un tableau - il ne s'ajoute pas à un tableau existant, il en crée un nouveau à chaque fois.
Donc, si l'entrée n est 1, elle renvoie simplement un tableau à un seul élément avec 1 dedans.
Si n> 1, il y aura un appel récursif. "results" a déjà été créé comme un tableau vide, donc les instructions .push () ajoutent un seul élément à ce tableau:
Si n est divisible par 3 et 5, le tableau sera ['FizzBuzz'] Si n est divisible par 3 seulement, le tableau sera ['Fizz'] Si n est divisible par 5 seulement, le tableau sera ['Buzz'] Sinon, le tableau sera [n] quel que soit n.
Puisque n> 1 (ou nous ne serions pas ici), nous devons appeler à nouveau FizzBuzz avec le n immédiatement inférieur et concaténer son résultat avec le nôtre. C'est ainsi que le long tableau est construit - en concaténant le tableau renvoyé par les appels récursifs à FizzBuzz.
Il crée d'abord un tableau de Vous avez raison, c'est déroutant. Une implémentation récursive bien meilleure serait résultats avec la dernière valeur (pour 100 ), puis crée récursivement un autre tableau avec les résultats pour les valeurs de 0 code> à 99 , et à la fin les concatène dans le bon ordre. function fizzBuzz(n) {
if (n <= 0) {
return [];
}
var results = fizzBuzz(n - 1);
if (n % 3 === 0 && n % 5 === 0) {
results.push('FizzBuzz');
} else if (n % 3 === 0) {
results.push('Fizz')
} else if (n % 5 === 0) {
results.push('Buzz')
} else {
results.push(n);
}
return results;
}
console.log(fizzBuzz(100));
resultsest mal nommé - il s'agit toujours d'une liste à 1 élément, donc le plurielsest trompeur. Il n'y a vraiment aucune raison pour que ce soit une liste. Pourquoi ne pas l'appeler simplementresult, ne serait-ce qu'un scalaire, puis simplementfizzBuzz (n - 1) .push (result)?@JohnColeman "résultats" peut être mal nommé mais la fonction doit renvoyer un tableau - les appels récursifs construisent un tableau qui contient finalement les "résultats"