【发布时间】:2017-06-11 02:55:19
【问题描述】:
虽然这个问题的答案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;
}
还有另一个似乎更容易理解的答案。但是,答案的某些部分我不明白。
function sumDigits(number) {
var sum = 0;
var numbers = number.toString().split(""); //turn the number to string and split the number in several digits
while(numbers.length > 0) {
sum += parseInt(numbers[0], 10); // covert string to number and force the number to be decimal and add the next number
numbers.splice(0, 1); //remove the first digit, in other words, removing "0" from sum, i think?
sumDigits(numbers.join('')); //join the array element into a string
}
return sum;
}
var sum = sumDigits(175);
$('#result').html(sum);
这是我能理解的:
var numbers = number.toString().split("");
将数字转换为字符串并将字符串拆分为子字符串数组。也就是说,如果数字为175,则将其转换为“175”,拆分为1、7、5。接下来,
while(numbers.length > 0) {
这确保数字是正数并且可以添加。但是,当我删除此行并在 JS Bin 中使用负数运行它时,它会返回错误。所以不知何故,重要的是只总结正数。接下来,
sum += parseInt(numbers[0], 10);
这(parseInt)将字符串或在我们的例子中的子字符串转换回数字并将每个数字添加到自身。但是我不明白 numbers 后面括号中的“0”,除非它指的是数组中的第一个数字 = [1, 7, 5]??不过,我可以看到,当我从这一行中删除 [0] 时,它会返回一个错误。另外,加上“sum +=”,应该像这样加起来 0 + 1 + 7 + 5。因此总和是 13。接下来,
numbers.splice(0, 1);
这是我不明白的部分。我知道 .splice 可以添加或删除项目。比如(0,1)的第一部分,也就是“0”,求数组的位置,也就是说,“0”求数组中“1”之前的第一个位置 = [1, 7 , 5]。最后一部分是“1”,指定要删除的项目数量。换句话说,它要求从数组中删除“1”,导致现在数组为 [7, 5]。但是,我认为根本不需要它,因为不需要从数字中删除任何数字。另外,我不明白评论说当总和应该是 13 时,这一行从总和中删除“0”?接下来,
sumDigits(numbers.join(''));
这应该将数组元素连接成一个字符串。换句话说,它应该将array = [1, 7, 5] 加入“1, 7, 5”。不过,我不明白为什么当这行 (sum += parseInt(numbers[0])) 将字符串转换回数字并将数字相加时需要这两行(.splice 和 .join)。但是,当我确实删除了这两行时,该功能不起作用...
请帮助我了解它是如何工作的,哪个是先执行的等等......
【问题讨论】:
-
为什么不把一对
console.logs 放在那里,自己看看它在做什么?
标签: javascript arrays string