每n次,跳过n项并将n增加1

时间:2017-01-05 00:02:34

标签: javascript

这可能是一个奇怪的问题,因为我有一个解决方案(如下),但希望有人能告诉我一个更简洁或可读的方法来做到这一点:

我创建了一个输出以下数组的循环:

[0,1,3,6,10,15,21,28,36,45,55,66,78,91]

数字之间的差距逐渐变大:

  • 1-0 = 1
  • 3-1 = 2
  • 6-3 = 3
  • 10-6 = 4
  • ...
  • 91-78 = 13

我是通过创建两个变量来实现的,step跟踪差距大小,count跟踪当前的位置'在差距。 count计为零,然后将step加1。

var output = [];
var step = 0;
var count = 0;

for (var i = 0; i < 100; i++) {
  if (count == 0){
    step += 1;
    count = step;
    output.push(i);
  }
  count -= 1;
}

3 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:

var output = [];
var total = 0;

for (var i=1; i < 100; i++) {
    output.push(total);
    total += i;
}

数字之间的差距只是每步增加一个,因此for循环应该能够跟踪这一变化。

答案 1 :(得分:0)

你应该跳过无用的迭代。如果您想要一个100个数字的序列,请使用

var output = [];
var step = 0;
for (var i = 0; i < 100; i++) {
  step += i;
  output.push(step);
}

如果你想要一般术语,

aₙ = ∑ⁿᵢ₌₀ i = n*(n+1)/2

所以你也可以这样做

var output = [];
for (var i = 0; i < 100; i++) {
  output.push(i * (i+1) / 2);
}

答案 2 :(得分:0)

您可以使用此解决方案保存总助手变量:

var output = [0]

for (var i = 1; i < 14; i++) {
  output.push(output[i - 1] + i)
}

console.log(output) // [ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91 ]

此解决方案考虑到添加计数器值的值已经存在于数组的最后位置。

也可以使用递归版本:

output = (function f(x) {
  return x.length == 14 ? x : f(x.concat([x[x.length - 1] + x.length]))
})([0])

console.log(output); // [ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91 ]

这里不需要额外的计数器变量。我使用concat,因为它返回一个我需要递归调用的数组,其中push返回新的数组长度。 concat的参数是一个数组,其中一个元素包含要添加的新值。

尝试online