1
votes

J'essaie de mieux comprendre la récursivité en utilisant le problème FizzBuzz en javascript

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));


2 commentaires

results est mal nommé - il s'agit toujours d'une liste à 1 élément, donc le pluriel s est trompeur. Il n'y a vraiment aucune raison pour que ce soit une liste. Pourquoi ne pas l'appeler simplement result , ne serait-ce qu'un scalaire, puis simplement fizzBuzz (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"


3 Réponses :


1
votes

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.


0 commentaires

2
votes

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.


0 commentaires

3
votes

Il crée d'abord un tableau de 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.

Vous avez raison, c'est déroutant. Une implémentation récursive bien meilleure serait

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));


0 commentaires