0
votes

Utilisez Récursion pour résumer des chiffres jusqu'à ce qu'il n'y ait plus rien à résumer

question forte>

la racine numérique est la somme récursive de tous les chiffres d'un nombre. p>

donné n, prenez la somme des chiffres de n. Si cette valeur a plus d'un chiffre, continuez à réduire de cette manière qu'un nombre à un chiffre est produit. Ceci est uniquement applicable aux nombres naturels. P>

mon code strong> p>

p>

function digital_root(n) {
    
      let a = n.toString();
      let ai = a.split('');
      
      let bi = ai.map((item)=>{
        return parseInt(item);
      })

      let newArr = [];

      for(let i = 0; i < bi.length; i++){
        let c = bi[i];
        newArr.push(c);
      }
      
      let d = newArr.reduce((total, item)=>{
      return total + item;
      }, 0); 
   
  function recursive(d){
    if(d < 10){
      return d
  }

      a = d.toString();
      ai = a.split('');
      
      bi = ai.map((item)=>{
        return parseInt(item);
      });

      newArr = [];

      for(let i = 0; i < bi.length; i++){
        let c = bi[i];
        newArr.push(c);
      }
      
      d = newArr.reduce((total, item)=>{
      return total + item;
      }, 0); 

      return recursive(d);
      }
     
     
    return d;
}


console.log(digital_root(123));
console.log(digital_root(111));
console.log(digital_root(51024));


0 commentaires

3 Réponses :


2
votes

Vous n'appelerez jamais la fonction récursive que vous avez faite, remplacez retour d code> sur retour récursif (d); code>

Comment je ferais cela: P>

function digital_root(n){
   return n < 10 ? n : digital_root(String(n).split('').reduce((acc,val) => acc+(val|0),0));
}


2 commentaires

Merci! Je suis surpris que cela ait fonctionné (car je crois comprendre la fonction récursive se trouve dans la fonction "digital_root". Par conséquent, lorsque la fonction récursive renvoie, je ne m'attendais pas à la fonction "digital_root" pour renvoyer le résultat de la fonction de récursive interne. Pourquoi ce travail ? :)


@Andrewneedshelp: Cela renvoie n (si n <10) ou les résultats de cet appel récursif vers digital_root (si N> = 10). Il est similaire à retour n% 2 == 0? "Même": "impair" . L'expression conditionnelle cond? RES: ALT Rendements res ou alt . À la fin, la déclaration renvoie renvoie simplement le résultat de cette expression conditionnelle.



1
votes

En plus de ce que photon a dit, voici une solution plus simple xxx


1 commentaires

JavaScript n'a pas de division entière, vous devez donc utiliser math.floor (n / 10) à la place. En outre, somme (x + somme (y)) === somme (x + y) , la dernière ligne doit donc être Somme de retour (n% 10 + math.floor (N / 10))



3
votes

Mettons dans certains commentaires pour voir ce qui se passe.

p>

function digital_root(n) {
    // convert multiple digit number to String
    let a = n.toString();
    // split the String into an array of single digit Strings
    let ai = a.split('');
    // convert String array into int array  
    let bi = ai.map((item)=>{
        return parseInt(item);
    })
    
    // it looks like you are just copying the array here, 
    //I don't think there is a need for that
    //  let newArr = [];

    //  for(let i = 0; i < bi.length; i++){
    //    let c = bi[i];
    //    newArr.push(c);
    //  }
      
    // reduce the int array to the sum of its digits
    let d = bi.reduce((total, item)=>{
        return total + item;
    }, 0); 
   
    // That should be it, now just print it or recurse it
    if (d < 10) {
        return d;
    }
    // here is how you recurse, call the method from within the method
    return digital_root(d);

    // I'm not sure what you are doing here, you are repeating code
    // this is not how recursion works
//        function recursive(d){
//            if(d < 10){
//              return d
//            }

//            a = d.toString();
//            ai = a.split('');
      
//            bi = ai.map((item)=>{
//                return parseInt(item);
//            });

//            newArr = [];

//            for(let i = 0; i < bi.length; i++){
//                let c = bi[i];
//                newArr.push(c);
//            }
      
//            d = newArr.reduce((total, item)=>{
//                return total + item;
//            }, 0); 

//            return recursive(d);
//        }
//        return d;
}


console.log(digital_root(123));
console.log(digital_root(111));
console.log(digital_root(51024));


1 commentaires

Vraiment utile, haha ​​a réalisé comment la corbeille mon code était: «D dans le bon sens!