你們在最初開始學習編程的時候必定都作過這樣一道題:git
步驟I 給定一個天然數n,編程
步驟II 將n中每一位數字相加,獲得一個新的天然數m學習
步驟III 賦值:n=mspa
步驟IV 判斷:若是n只有一位數字(即0≤n<10)則輸出數字n,不然返回到步驟II。code
沒錯這是道簡單的題目,大部分同窗的思路也跟上面給出的四步差很少。嗯,我也一直是這麼作的,直到在CodeWars上面看到了這樣一段代碼……blog
1 public class DRoot { 2 public static int digital_root(int n) { 3 return (n != 0 && n%9 == 0) ? 9 : n % 9; 4 } 5 }
嗯,沒錯,不須要用遞歸反覆加,只要求一個模一步就出來了。至於爲何能夠這麼作,以本人微弱的數學功底只能從找規律的角度理解一下了:以下表所示,求和結果其實是從1到9反覆循環,所以只要用n模9並對結果爲0的狀況單獨處理一下就能夠了……若是你們有更好的想法歡迎在評論裏給出。遞歸