将多位数减少到一位数 - 请指导不回答

Reduce a multi-digit to one-digit -guidance not answer please

目标:取一个数字,如 54321,将数字相加 (5+4+3+2+1 = 15),然后取该数字 (15) 加上数字 (1+5 = 6),所以return6;

这是我的代码:

function digital_root(n) {

 if (n >=10) {
  var digits = n.toString().split('').map(function(item, index) {return parseInt(item)}).reduce(function(a,b){ return a+b});
   console.log(digits);
 } 
}

digital_root(1632)

想不通:如何让该函数一遍又一遍地重复,直到数字只是一个数字(即小于 10)。我尝试了各种嵌套函数,但似乎无法正确使用。

如果可能请指出解决方案的方向("try a nesting in a while... or read up on..."),但不要给我完整的代码解决方案("Use this code chunk:....")。我已经养成了只看书抄抄的坏习惯...

谢谢!

试试这个:参考 HERE

function digital_root(n) {

    var singlesum = 0;
    while (n >= 10 ) {
                 singlesum=0;
        while (n > 0) {
            var rem;
            rem = n % 10;
            singlesum = singlesum + rem;
            n = parseInt(n / 10);
        }
        n = singlesum;
    }
  
  console.log(singlesum);
}

digital_root(1632)

嗯,这不是一个很好的解决方案,但你可以试试。

function digital_root(n) {

 if (n >=10) {
  var digits = n.toString().split('').map(function(item, index) {return parseInt(item)}).reduce(function(a,b){ return a+b});
   console.log(digits);
   return(digits);
 } 
}
var num = 1632;
do{
num = digital_root(num);
}while(num>10);

你可以使用递归来解决这个问题。 写一个函数 makeSingleDigit,参数就是你的数字。 您需要一个带有基本步骤的基本条件,在您的情况下,当收到的数字是 one-digit 和 returns 时停止递归。 如果条件不成立,您只需要从 n%10 的数字中获取另一个数字并将其与 makeSingleDigit(Math.floor(n/10)) 相加。这样,您重复对新数字的数字求和,直到函数接收到 one-digit 个数字。

数学解仅供参考:你要求的数是n % 9 === 0 ? 9 : n % 9,所以不为0就是9除的余数,否则就是是 9.

下面是问题的最佳解决方案:

function digital_root(n) {
  return (n - 1) % 9 + 1;
}

const result = digital_root(1632);
console.log(result);