解释这个javascript代码如何将两个数字和它们之间的数字相加

时间:2017-12-07 19:41:13

标签: javascript loops

我正在上javascript课程,我现在正在做一些小项目。

一个项目是这样的: 给定两个整数,可以是正数和负数,找到包含它们之间的所有数字的总和并返回它。如果两个数字相等,则返回a或b。

我找到的解决方案之一是:

function GetSum(a, b) {
    if(a == b) {
        return a
    }
    else if (a < b) {
        return a + GetSum(a+1, b)
    } else {
        return a + GetSum(a-1, b)
    };
}
console.log(GetSum(-1, 2));

请,我想解释一下代码的工作原理。

...而且,我想知道为什么下面的代码总是返回0

function GetSum(a, b) {
    let lower, higher;
    let result = 0;
    //return either of it if they are equal
    if(a == b) {
        return a;
    } else {
        if(a > b) {
            higher = a;
            lower = b;
        } else {
            higher = b;
            lower = a;
        }
        for(i = lower; i <= higher; i++) {
            result += i;
        }
    }
    return result;
}
console.log(GetSum(3, 9))

提前致谢

1 个答案:

答案 0 :(得分:0)

我们可以将代码简化为:

function getSum( a,b ){
   if (a == b) return a; //(1)
   if (a < b) {
      return a + getSum(a+1, b); //(2)
   }else {
      return a + getSum(a-1,b); //(3)
   }
}

getSum(1,3)

所以在第一个函数调用时a是1而b是3所以它进入分支2:

return 1 +  getSum(1 + 1, 3)

所以现在getSum是从getSum里面调用的,那叫做递归。现在getSum再次进入分支2并且

 return 2 + getSum(2 + 1, 3)

现在等于b,getSum现在进入分支1并返回(3)。如果我们总结上面的三行

 getSum(1,3)
 1 + getSum(2,3)
 1 + ( 2 + getSum(3,3))
 1 + ( 2 + (3)) 

作为oneliner的整个事情:

 const getSum = (a, b) => a === b ? a : getSum(a + (a < b)?1:-1, b);

或使用循环:

 const getSum = (a, b) => {
   const res = 0;
   if(b < a) [a,b] = [b,a];
   while(a <= b) res += a++;
   return res;
}

或使用棘手的数学:

const getSum = (a, b) => 1/2 * Math.abs((a ** 2 + a - b ** 2 - b));