2017-01-17 21 views
1

目标:拿一个像54321这样的数字,把数字加在一起(5 + 4 + 3 + 2 + 1 = 15),然后取这个数字(15)添加数字(1 + 5 = 6),所以返回6;减少一位数字到一位数字 - 请不要回答

这里是我的代码:

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)。我尝试了各种嵌套函数,但似乎无法做到。

如果可能,请指出解决方案的方向(“尝试嵌套在一段时间......或阅读......”),但不要给我完整的代码解决方案(“使用此代码块:....“)。我养成了只读和复制的坏习惯...

谢谢!

+0

我的第一个对非专家的建议是摆脱“地图”。即使对于有很多经验的人来说,地图通常在概念上也很具挑战性相反,尝试一个显式循环,在找到数字时需要使用'/ 10'和'%10'。祝你好运。 –

+0

谢谢!我会尝试和nix的地图,并按照你的建议循环工作! – Megan

回答

1

您可以使用递归来解决这个问题。 写一个函数makeSingleDigit,其中的参数将是你的号码。 你需要一个基础条件与基地步骤,在你的情况下,当收到的数字是一位数字并返回数字时停止递归。 如果条件不成立,您只需从n%10中得到另一个数字,并将其与makeSingleDigit(Math.floor(n/10))相加即可。由此,您重复总结新数字的数字,直到功能收到一位数字。

只为您的信息,数学解决方案:数字,要找到的是n % 9 === 0 ? 9 : n % 9,因此它是除以9余数,如果它不为0,否则是9

+0

谢谢你的帮助! – Megan

2

试试这个:参考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)

+0

谢谢链接的图表,绝对把我想要映射的东西放在脑海里。 – Megan

0

嘛,不是一个很好的解决方案,但你可以给一个打击。

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