return 对一个范围内的所有数字求和

return sum all numbers in a range

function sumAll(arr) {
    var list = [];

    for (var i = arr[0]; i <= arr[1]; i++) {
        list.push(i);
    }

    var total = list.reduce(function(a, b) {
        return a + b;

    });

    return total;
}

sumAll([10, 5]);
//sumAll([1, 4]);  //returns 10
//sumAll([5, 10]); //returns 45
//sumAll([4, 1]);

我需要对给定参数之间的每个数字求和。对于 sumAll([1, 4])sumAll([5, 10])。该代码将通过,因为它在两个参数之间创建所有数字并将其相加。但是,对于 sumAll([10, 5])sumAll([4, 1]),因为较大的数字是第一个参数,我相信它不在 运行 var 列表中。我尝试在两者之间使用 .sort() 方法,以便对数字进行排序但无法使其正常工作。我怎样才能使用 Math.min()Math.max() 使此代码起作用?

function sumAll(arr) {

    var first = arr[0] > arr[1] ? arr[1] : arr[0],
        last = arr[0] > arr[1] ? arr[0] : arr[1];
        sum = 0;
    for (var i = first; i <= last; i++) {
        sum += i;
    }
    return sum;
}

您可以将数组应用于 Math.minMath.max 函数。

function sumAll(arr) {
  var list = [];

  for (var i = Math.min.apply(null, arr); i <= Math.max.apply(null, arr); i++) {
    list.push(i);
  }

  var total = list.reduce(function(a, b) {
    return a + b;
  }, 0);

  return total;
}

[[10, 5], [1, 4], [5, 10], [4, 1]].forEach(function(range) {
  console.log(range.join(' -> ') + ' = ' + sumAll(range));
});

输出:

10 -> 5 = 45
1 -> 4 = 10
5 -> 10 = 45
4 -> 1 = 10

最简单的方法是使用数学公式

1+2+...+n = n(n+1)/2

这里你要求和,

m+(m+1)+...+n

其中 m=arr[0]n=arr[1]。这等于差

(1+2+...+n) - (1+2+...+(m-1))

将上式代入两次等于

n(n+1)/2 - (m-1)m/2

所以正确的代码是

function sumAll(arr) {
  var min = arr[0];
  var max = arr[1];
  return (max*(max+1) - (min-1)*min)) / 2;
}

原始答案(请勿使用 - 留给后代使用):

下面是我如何使用 Math.minMath.max 来做到这一点:

function sumAll(arr) {
    var list = [];

    var lower = Math.min(arr[0], arr[1]);
    var upper = Math.max(arr[0], arr[1]);

    for (var i = lower; i <= upper; i++) {
        list.push(i);
    }

    var total = list.reduce(function(a, b) {
        return a + b;
    });

    return total;
}

其他人使用 arr[0] < arr[0] ? arr[0] : arr[1] 发布了代码; IMO Math.minMath.max 函数比 ? : 运算符。

此外,还有两分钱:我相信根本不制作 var list 会更简单;而是说 var total = 0 并增加它。像这样:

function sumAll(arr) {
    var lower = Math.min(arr[0], arr[1]);
    var upper = Math.max(arr[0], arr[1]);

    var total = 0;

    for (var i = lower; i <= upper; i++) {
        total += i;
    }

    return total;
}

.sort()数组按字符串排序,使用compareFunction按数值排序:

arr.sort(function(a, b) {
  return a - b;
});

如果你想使用 min 或 max,你将数组作为参数传递:

1) Math.max.apply(this, arr); || Math.min.apply(this, arr);

2) Math.max(arr[0], arr[1]) || Math.min(arr[0], arr[1])

Javascript代码:

function myFunction(arr) {
  console.log(arr);
  var list = [];

  var startVal = arr[0];
  console.log(startVal);
  var stopVal = arr[1];
  console.log(stopVal);

  while(startVal < stopVal+1){
    list.push(startVal++);
  }
      console.log(list);

      var total = list.reduce(function(a, b) {
          return a + b;

      });

     // return total;
      document.getElementById("demo").innerHTML = total;
  }

HTML 代码:

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
  <script src="app2.js"></script>
</head>
<body>
  <button onclick="myFunction([5,10])">Try it</button>
  <div id="demo"></div>
</body>
</html>

这是数学方程派上用场的时代之一。查看此代码:

function sumAll(arr) {
  max = Math.max(arr[0], arr[1]);
  min = Math.min(arr[0], arr[1]);
  return (max * (max + 1) / 2) - ((min - 1) * min / 2);
}

很简单的逻辑,对吧? :)

这是一种方法:

function sumAll(arr) {
  var sortedArray = arr.sort(function(a,b) { 
    return a-b;
  });

  return sortedArray.reduce(function(a, b, start, arr) {
    var temp = a, subTotal = a;
    while (temp < b - 1) {
      subTotal += ++temp;
    }

    return subTotal + b;
  });
}

我就是这样滚的

function sumAll(arr) {
return (arr[0]+arr[1])*(Math.max(...arr)-Math.min(...arr)+1)/2;;
}

我会简单一点:

function sumAll(arr) {

  var sum = 0;

  arr.sort(function(a, b) {
    return a - b;
  });

  for (var i = arr[0]; i <= arr[arr.length - 1]; i++) {
   sum += i;
  }

  return sum;

}

sumAll([4, 1]);

我更喜欢简单....

function sumAll(arr) {
 var max = Math.max.apply(null, arr);
 var min = Math.min.apply(null, arr);
 var sum = 0;
 for(var i = min; i <= max; i++)
 sum = sum + i;
 return sum;
}
sumAll([1, 4]);

function sumAll(arr) {
  var max = Math.max.apply(null, arr);
  var min = Math.min.apply(null, arr);
  var arr2 = [];

  for (var i = min; i <= max; i++) {
    arr2.push(i);
  }

  return arr2.reduce(function(sum, item) {
    sum += item;
    return sum;
  }, 0);
}

console.log( sumAll([1, 4]) )

function sumAll(arr) {
  const rangeStart = Math.min(arr[0], arr[1]);
  const rangeEnd = Math.max(arr[0], arr[1]);
  const numberOfDigits = rangeEnd - rangeStart + 1;

  return (rangeEnd + rangeStart) * numberOfDigits / 2;
}

它是这样的: https://betterexplained.com/articles/techniques-for-adding-the-numbers-1-to-100/

但并不总是从 1 开始,而是从 "rangeStart" 开始,而且 numberOfDigits 并不总是 rangeEnd,但思路是一样的。

在α和β之间,有β−α+1个数。我们需要

S=α+(α+1)+⋯+β=β+(β−1)+⋯+α

垂直相加,我们有

2S=(β−α+1)(α+β)

因此

S=(β−α+1)(α+β)2

这项 "reverse and add" 技术源于高斯,也可用于对任何算术级数求和。

function sumAll(arr) {
  let alpha = Math.min(...arr);
  let beta= Math.max(...arr); 
  return ((beta - alpha + 1)*(alpha + beta))/2;      
}

这个怎么样?遵循高斯公式:

function sumAll(arr) {
    return arr.reduce((a,b) => (a+b)*(Math.abs(a-b) + 1) / 2)
}

console.log(sumAll([1,4])); //10
console.log(sumAll([5,10])); //45
console.log(sumAll([10,5])); //45

像这样的 O(1) 方法可能是最好的方法:

function SumRange(a, b) {
    if (a > b) {
        return 0;
    }

    const sum = (b * ++b) / 2;
    return a > 1 ? sum - SumRange(0, --a) : sum;
}

var array = [1, 100];

console.log(SumRange(array[0], array[1]));//5050
console.log(SumRange(10, 100));//5005

我们的想法是孤立 SumRange 方程,这样它就可以成为可以从任何地方调用的唯一真实来源。可重用性总是一个优势。

加上 ES6

function sumAll(arr) {
   const min = Math.min(...arr)
   const max = Math.max(...arr)
   let list = [] 
   for(let i = min;i <= max; i++){
      list.push(i)
   }

   return list.reduce((prev, next) => prev + next);
}

sumAll([1, 4]);

使用 while 循环:

function sumAll(arr) {
    var i = Math.min(...arr)
    var total = 0
    while(i <= Math.max(...arr)) {
        total += i
        i++
    }

    return total;
}
sumAll([1, 4];