如何在JavaScript中使用此函数对一个范围内的所有数字求和?

如何在JavaScript中使用此函数对一个范围内的所有数字求和?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在完成这项编码挑战 他们建议使用Math.max、Math.min、Array.reduce,但是我开始研究一个解决方案,该解决方案没有使用这些方法中的任何一种,但很快发现可能我应该使用,因为我的版本开始显得有点笨拙 function sumAll(arr){ var index0 = arr[0], index1 = arr[1], counter = 0, sum = 0, val; if(index0 < index1){ counter +=

我正在完成这项编码挑战

他们建议使用Math.max、Math.min、Array.reduce,但是我开始研究一个解决方案,该解决方案没有使用这些方法中的任何一种,但很快发现可能我应该使用,因为我的版本开始显得有点笨拙

function sumAll(arr){
    var index0 = arr[0], index1 = arr[1], counter = 0, sum = 0, val;
    if(index0 < index1){
         counter += index0;
        while(counter <= index1){
              val = index0++;  
              sum += val;     
              counter++;
         }

  } else if(index0 > index1){
         counter = 1;
         counter += index0;
        while(counter >= index1){
              val = index1 + 1;  
              sum += val;     
             counter--;
         }
    }
   return sum;
}
因此,我的两个问题如下:

它变得笨重了,我说得对吗? 我应该使用上述推荐的方法吗? 我想当我有事情要做的时候,我会很兴奋,但现在我觉得我正因为另一种潜在的情况而陷入困境

提前谢谢

可以使用最小值、最大值和一个循环

var sumAll=功能RR{ var总和=0, 最小值=Math.min.applynull,arr, max=Math.max.applynull,arr; 对于var i=min;i可以使用min、max和一个循环

var sumAll=功能RR{ var总和=0, 最小值=Math.min.applynull,arr, max=Math.max.applynull,arr;
对于var i=min;i这里有一个更快的版本,它利用了这样一个事实,即您不必实际将序列中的每个序列号相加,但您可以根据起点和终点计算总和:

function sumAll(args) {
    var min = Math.min.apply(Math, args),
        max = Math.max.apply(Math, args);
  return min + ((max - min) * ((max + min + 1) / 2));
}
还有,这里有一个测试台:它将其与老式的精确性方法进行比较

为了实现纯粹的性能而不是代码的简洁性,最好只比较两个值,而不是进行两次函数调用:

function sumAllFaster(args) {
    var min, max;
    if (args[0] < args[1]) {
        min = args[0];
        max = args[1];
    } else {
        min = args[1];
        max = args[0];
    }
    return min + ((max - min) * ((max + min + 1) / 2));
}
如果您针对@NenadVracar答案进行测试,并包括一些大范围,则最后一个版本的速度会快100倍。范围越长,速度差异越大。即使在短范围内,速度也会快3-4倍。此处的定时测试:

这里有一个稍微快一点的版本:

function sumAllFastest(args) {
    var diff = args[0] < args[1] ? args[1] - args[0] : args[0] - args[1];
    return (1 + diff) * ((args[0] + args[1]) / 2)
}

这是一个稍微快一点的版本,它利用了一个事实,即您不必实际添加序列中的每个序列号,但您可以根据起点和终点计算该和:

function sumAll(args) {
    var min = Math.min.apply(Math, args),
        max = Math.max.apply(Math, args);
  return min + ((max - min) * ((max + min + 1) / 2));
}
还有,这里有一个测试台:它将其与老式的精确性方法进行比较

为了实现纯粹的性能而不是代码的简洁性,最好只比较两个值,而不是进行两次函数调用:

function sumAllFaster(args) {
    var min, max;
    if (args[0] < args[1]) {
        min = args[0];
        max = args[1];
    } else {
        min = args[1];
        max = args[0];
    }
    return min + ((max - min) * ((max + min + 1) / 2));
}
如果您针对@NenadVracar答案进行测试,并包括一些大范围,则最后一个版本的速度会快100倍。范围越长,速度差异越大。即使在短范围内,速度也会快3-4倍。此处的定时测试:

这里有一个稍微快一点的版本:

function sumAllFastest(args) {
    var diff = args[0] < args[1] ? args[1] - args[0] : args[0] - args[1];
    return (1 + diff) * ((args[0] + args[1]) / 2)
}

这里有一个稍微慢一点的版本,但它在ES6中,这很酷

function sumAll(arr, n=1){
    const [min, max] = arr.sort();
    return Array(max+n).fill(0,min-n,max+n).reduce((a,b,i) => a+i);
}

这里有一个稍微慢一点的版本,但它在ES6中,这很酷

function sumAll(arr, n=1){
    const [min, max] = arr.sort();
    return Array(max+n).fill(0,min-n,max+n).reduce((a,b,i) => a+i);
}

解决这一问题的直观方法是:

查找输入数组的最小值和最大值。 从最小值到最大值对所有数字求和。 大概是这样的:

sumAll = function(arr) {
var low_bound = Math.min.apply(Math, arr);
var up_bound = Math.max.apply(Math, arr);

result = 0;
for (i=low_bound;i<=up_bound;i++){
    result += i;
}
return result

}解决这个问题的直观方法是:

查找输入数组的最小值和最大值。 从最小值到最大值对所有数字求和。 大概是这样的:

sumAll = function(arr) {
var low_bound = Math.min.apply(Math, arr);
var up_bound = Math.max.apply(Math, arr);

result = 0;
for (i=low_bound;i<=up_bound;i++){
    result += i;
}
return result

}我很确定,当他说:一个数字数组时,他/她不是指一个包含这两个数字的数组对象。所以我给你这个斯巴达JS:

function sum_range(x,y){ return( 1 + ( x < y ? y - x : x - y ) ) * (x + y) / 2; }
v、 s:


我很确定,当说:一个数字数组时,他/她并不是指一个包含这两个数字的数组对象。所以我给你这个斯巴达JS:

function sum_range(x,y){ return( 1 + ( x < y ? y - x : x - y ) ) * (x + y) / 2; }
v、 s:



谢谢Nenad,我喜欢你的解决方案非常简单!更少的代码;谢谢Nenad,我喜欢你的解决方案非常简单!更少的代码;只是好奇。为什么创建数组只是为了求顺序值的和很酷?@jfriend00-因为。。。这是ES6@Пааааааааааааааа。为什么创建数组只是为了求顺序值的和很酷?@jfriend00-因为。。。它是ES6@МаааааПааааааааааааааа。但无论你做什么,我的都是最快的。添加了一些关于各种选项性能测试的注释。不,你刚刚偷了我的纯数学三元并将其添加到你的收藏中。但无论你做什么,我的都是最快的。问题明确地说:我们将传递给你一个由两个数字组成的数组。再清楚不过了。对于每两个或两个以上的数字;项目;就性能而言,我的斯巴达人仍然比你的最快速度快约25%,即使我不得不削弱它以适应你为单参数数组输入所做的测试算法,如:函数sum_rangex{return 1+x[0]失去最佳性能的ng是一种破坏。我们在谈论速度。你们看,Math对象并不完全是一个本地JavaScript对象。我的Spartan更快,因为它不依赖于数学对象调用,不迭代,不创建新变量,只返回一个基本的数学结果。问题毫无疑问地说:我们将向您传递一个由两个数字组成的数组。再清楚不过了。对于每两个或两个以上的数字;项目;就性能而言,我的斯巴达人仍然比你的最快速度快约25%,即使我不得不削弱它以适应你为单参数数组输入所做的测试算法,如:函数sum_rangex{return 1+x[0]