我在这里看到了这个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)
,则会将1
和4
=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;
}