搞清楚添加数字位数后面的javascript片段

时间:2017-01-22 06:41:59

标签: javascript

我看到了这个javascript代码段/问题here最好的答案是

function sumDigits(number) {
    var remainder = number % 10;
    var sum = remainder;
    if(number >= 10) {
        var rest = Math.floor(number / 10);
        sum += sumDigits(rest); 
    }
    return sum;
}

我试图了解它的工作原理。我可以理解一些线路,但它令人困惑。

我能理解的是

var remainder = number % 10;
var sum = remainder;

返回该数字的剩余部分。换句话说,如果数字是145并且它除以10,则余数为5.因此,总和为5.接下来,

if(number >= 10) {

这个数字必须大于或等于10,因为你不能单独加一个数字,因此' 10' 10是您可以将两位数加在一起的最小值。接着,

var rest = Math.floor(number / 10); 
145除以10是14.5。 Math.floor会将其四舍五入为14.因此,rest = 14.接下来,

sum += sumDigits(rest);

由于rest为14,这意味着sumDigits为14.因此,总和为5,它将自己添加到其余部分。换句话说,sum = 5 + 14.总之,总和是19.

这就是为什么它让我感到困惑,因为当145 = 1 + 4 + 5 = 10时它并没有加起来。换句话说,总和应该是10,而不是19? !?!?????

3 个答案:

答案 0 :(得分:4)

让我为你分解一下:

sumDigits(145)
5 + sumDigits(14)
5 + 4 + sumDigits(1)
5 + 4 + 1 => 10

更新1

添加括号,显示其实际工作原理:

sumDigits(145)
5 + sumDigits(14)
5 + (4 + sumDigits(1))
5 + (4 + 1) 
5 + 5 => 10

更新2

实际上,中间结果可以打印出来。

function sumDigits(number) {
    var temp;
    var remainder = number % 10;
    var sum = remainder;
    if (number >= 10) {
        var rest = Math.floor(number / 10);
        console.log(sum + " + sumDigits(" + rest + ")");
        temp = sumDigits(rest);
        console.log(sum + " + " + temp);
        sum += temp;
    }
    return sum;
}
console.log(sumDigits(145));

答案 1 :(得分:1)

这个功能正常运作。

一旦你最终得到19,它会在同一个函数中再次运行,因为19大于10.所以1 + 9将等于10.

答案 2 :(得分:0)

我认为这里的关键是

  

由于休息是14,这意味着sumDigits是14。

如果您只运行NSView,则会将NSOpenGLLayersumDigit(14) = 1相加。 然后4被添加到5

中的原始5

当我想到这一点时,我对它进行了重构,这有助于我理解发生了什么。以下是另一种思考方式:

5