计算出添加数字背后的javascript片段



我在这里看到了这个javascript片段/问题最好的答案是

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"是您可以将两个数字相加的最小值。接下来,

var rest = Math.floor(number / 10); 

145除以10是14.5。Math.floor将把它四舍五入到14。因此,rest=14。接下来,

sum += sumDigits(rest);

由于rest是14,这意味着sumDigits是14。既然和是5,它就把自己加到其余的上。换句话说,和=5+14。总之,总数是19。

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

让我为您分解一下:

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

函数工作正常。

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

我认为这里的关键是

由于rest是14,这意味着sumDigits是14。

如果只运行sumDigit(14),则会将14=5相加。然后在145中将5添加到原始5

当我仔细思考这个问题时,我对它进行了一些重构,这有助于我理解发生了什么

function sumDigits(number) {
var integerDigit = number % 10;
// If there are digits remaining (i.e. not a single digit number)
if(number >= 10) {
// Return the current digit plus sumDigits of remaining digits
return integerDigit + sumDigits(Math.floor(number / 10));
}
// If it is a single digit, just return the number
return number;
}

最新更新