【问题标题】:Figuring out the javascript snippet behind adding the digits of number找出添加数字数字背后的javascript片段
【发布时间】:2017-01-22 06:41:59
【问题描述】:

我看到这个javascript sn-p/问题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”是您可以将两个数字相加的最小值。接下来,

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

145 除以 10 是 14.5。 Math.floor 会将其向下舍入为 14。因此,rest = 14。接下来,

sum += sumDigits(rest);

因为余数是 14,这意味着 sumDigits 是 14。所以,因为和是 5,所以它把自己加到余数中。也就是说,总和 = 5 + 14。总而言之,总和是 19。

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

【问题讨论】:

标签: javascript


【解决方案1】:

让我为你分解一下:

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

【讨论】:

  • 非常感谢!我想知道我是否可以请您成为导师或认识任何可以成为导师的人?我正在寻找 Javascript 方面的导师,因为我正在学习 Javascript 并且有几个问题......
  • @KristinaBressler 很高兴!很荣幸有人让我成为导师,我很想成为你的导师,但我不是一个经验丰富的 Javascript 程序员,虽然我有一些编程背景,但我也在学习 JS。我知道“stackoverflow”是一个提问的好地方,这里有很多人很乐意帮助别人解决问题并回答他们的问题,让我们一起学习,共同进步!
  • 真的吗?这是函数在做什么?呵呵!
  • 是的...但是,有时我没有得到我发布的一些问题的答案。因此,这就是我需要一位导师的原因,我的导师和我可以在其中讨论 JS 并帮助我复习我错过或不理解的内容....
  • @NabeelKhan 是的。这就是递归的工作原理,我已经更新了我的答案,运行 sn-p 你会看到它。
【解决方案2】:

该功能按预期正常工作。

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

【讨论】:

    【解决方案3】:

    我认为这里的关键是

    因为 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2021-03-19
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多