2
votes

Comment passer une variable dans une boucle while JS?

Je veux faire la somme récursive d'un entier: pour diviser un entier en un tableau, puis additionner les éléments individuels jusqu'à ce que je me retrouve avec un seul tableau d'entiers.

Voici ma logique:

  1. Prenez un entier (n) et divisez-le en un tableau.
  2. Additionnez tous les nombres individuels.
  3. Le nombre est-il supérieur à 9?
    1. OUI: répétez les étapes 1 et 2
    2. NON: renvoyer le numéro
function digital_root(n) {
  return (n - 1) % 9 + 1;
}

Ceci est le code d'erreur que mon Node.js me lance (à la ligne 4 dans l'exemple de code ci-dessus):

ReferenceError: digits is not defined
    at digital_root (repl:6:18)

Je suppose que la variable digits est accessible dans le cadre de la boucle while, mais évidemment, je semble me tromper? Quelqu'un pourrait-il me donner un aperçu ici, s'il vous plaît?


EDIT: Merci à tous pour votre aide! J'ai résolu le problème. Pour votre curiosité, voici la forme mathématique sous-jacente à mon algorithme: http://mathworld.wolfram.com/DigitalRoot.html

Il aurait également pu être résolu en une seule ligne:

function digital_root(n) {
  let digits = (""+n).split("").map(Number);
  while (digits.length > 1) {
    let result = digits.reduce((sum, int) => sum + int);
    let digits = (""+result).split("").map(Number);
  }
  return digits;
};


3 commentaires

Cela signifie probablement que chiffres n'a pas de valeur. Faites console.log (digits) juste avant la boucle while


la variable est accessible dans la fonction que j'ai vérifiée. Ce n'est que dans la boucle while qu'il n'est pas accessible.


retirez le let à l'intérieur de votre boucle. vous le définissez deux fois.


3 Réponses :


2
votes

Ne définissez pas chiffres de cette manière, les chiffres à l'intérieur de la boucle ne devraient pas avoir let devant elle car vous avez chiffres déjà définis en dehors de la boucle.

Cela vous donnera le résultat attendu:

digital_root = n => (Array.from(`${n}`)).reduce((sum, val) => sum + ~~val, 0);


console.log(digital_root(12345));

J'espère que cela vous aidera,


0 commentaires

2
votes

Le let intérieur pour les chiffres (ligne 5) doit être supprimé

function digital_root(n) {
  let digits = (""+n).split("").map(Number);
  while (digits.length > 1) {
    let result = digits.reduce((sum, int) => sum + int);
    digits = (""+result).split("").map(Number);
  }
  return digits;
}


0 commentaires

2
votes

Le problème est le mot-clé let, car let a une portée de niveau bloc, "digits" n'est pas défini au début de la boucle while

Suppression de let pour les chiffres dans la boucle while

function digital_root(n) {
  let digits = (""+n).split("").map(Number);
  while (digits.length > 1) {
    let result = digits.reduce((sum, int) => sum + int);
    digits = (""+result).split("").map(Number);
  }
  return digits;
}

console.log(digital_root(47))


0 commentaires