2017-01-17 50 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);