我正在上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))
提前致谢
答案 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));