J'écris une fonction qui prend un nombre positif et renvoie le nombre de fois que vous devez multiplier les chiffres en num jusqu'à ce que vous atteigniez un seul chiffre.

Exemple:

test(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
                   // and 4 has only one digit//if single digit return num

Le code:

function test(num) {
if (num > 10) { return num} else {
   var j = num;var a;var count = 0;
while ( j > 10){
   a = num.toString().split('').map( e=> parseInt(e)).reduce((a,c)=> a*c);
   num = a;
   count++;
   j--; 
   }  
return count;
}}

test(39) //outputs 29 expected 3;

J'ai corrigé ce qui précède en ajoutant un tableau et en filtrant les valeurs uniques, mais j'aimerais toujours savoir pourquoi le code me donne un nombre beaucoup plus élevé que prévu.

0
dan brown 20 nov. 2018 à 13:12

4 réponses

Meilleure réponse

Vous cherchez peut-être à utiliser la récursion ici - si le num est plus petit que 10, retournez 0, sinon, effectuez la multiplication nécessaire, puis retournez 1 + le résultat de l'appel de test sur le produit :

function test(num) {
  return num < 10
  ? 0
  : 1 + test(
    num.toString().split('').reduce((a, c) => a * c)
  )
}

console.log(test(39));

(notez que * contraindra déjà les chaînes aux nombres, pas besoin de parseInt)

2
CertainPerformance 20 nov. 2018 à 10:15

Correction dans votre code, vous pouvez comparer

    function test(num) {
if (num < 10) { return num} else {
   var a;var count = 0;
while ( num > 10){
   a = num.toString().split('').map( e=> parseInt(e)).reduce((a,c)=> a*c);
   num = a;
   count++;

   }  
return count;
}}

test(39) //outputs 3;
1
Anubrij Chandra 20 nov. 2018 à 10:21

Vous décrémentez j, qui est initialement 39. Il atteindra 10, puis il renverra le nombre de fois qu'il a été décrémenté (29 fois, ce qui coïncide avec votre résultat). Vous devez effectuer les opérations suivantes, en supposant que la pièce scindée est correcte:

function test(num) {
if (num < 10) { return num} else {
   var j = num;var a = 11; // just to enter the while loop at least once
   var count = 0;
while ( a > 10){
   a = num.toString().split('').map( e=> parseInt(e)).reduce((a,c)=> a*c);
   num = a;
   count++;
   j--; 
   }  
return count;
}}
0
Bogdan 20 nov. 2018 à 10:24

Vous avez décrémenté votre num de 1 à chaque itération. Il vous donne 29 parce que 39 - 10 est 29. Vous n'avez pas mis à jour le num réel que vous devez comparer s'il est toujours supérieur à 10.

Faites ceci à la place:

function test(num) {
  if (num < 10) {
    return num
  } else {
    var count = 0;
    while (num > 10) {
      num = num.toString().split('').map(e => parseInt(e)).reduce((a, c) => a * c);
      count++;
    }
    return count;
  }
}

console.log(test(39))
0
ACD 20 nov. 2018 à 10:39