在减去和添加数组项之间交替

Alternate between subtracting and adding array items

我正在尝试使用 Gregory-Leibniz series 创建一个计算圆周率的公式。我创建了一个 for 循环,它用各个值填充一个新数组,但我需要一种方法来交替减去和添加每个数组项,然后吐出结果数。本质上,我需要做这样的事情:

(4/1) - (4/3) + (4/5) - (4/7) + (4/9) - (4/11) + (4/13) - (4/ 15)

以下 for 循环正在正确填充新数组:

var arrLimit = 39; 
var newArray = [];

for(i = 1; i <= arrLimit; i += 2) {     
    newArray.push(4/i);
}

此时我卡住了。我需要一些方法来获取 newArray 并在减法和加法之间交替,然后生成最终数字。

保留一个额外的变量,isNeg = true。在循环的每次迭代中,只需将其替换为 isNeg = !isNeg;.

var arrLimit = 39; 
var newArray = [];
var isNeg = false;

for(i = 1; i <= arrLimit; i += 2) {     
    isNeg = !isNeg;
    var val = 4/i;
    if (isNeg) {
        val *= -1;
    }
    newArray.push(val);
}

你也可以给变量赋值1,然后每次乘以-1来翻转:

var arrLimit = 39; 
var newArray = [];
var factor = 1;

for(i = 1; i <= arrLimit; i += 2) {     
    factor *= -1;
    var val = factor * 4 / i;
    newArray.push(val);
}

我个人更喜欢第二种方法,但两种方法都很好。

您可以添加一个额外的变量。如果你愿意,你可以同时求和。

  var arrLimit = 39; 
  var newArray = [];
  var a=-1
  var sum =0
  for(i = 1; i <= arrLimit; i += 2) { 
      a*=-1;
      newArray.push(a*4/i);
      sum+=a*4/i
  }

你可以用reduce对你的数组进行求和,然后根据数组的索引判断*=-1或*=1。

代码如下:

//Test Case 1
var arrLimit = 39; 
var newArray = [];

for(i = 1; i <= arrLimit; i += 2) {     
    newArray.push(4/i);
}

console.log(newArray.reduce(function(pre, cur, currentIndex){
  return pre+cur*(currentIndex%2 ? -1 : 1);
  }, 0));

//Test Case 2
arrLimit = 11139; 
newArray = [];
for(i = 1; i <= arrLimit; i += 2) {     
    newArray.push(4/i);
}
console.log(newArray.reduce(function(pre, cur, currentIndex){
  return pre+cur*(currentIndex%2 ? -1 : 1);
  }, 0));

I need some way to take newArray and alternate between subtracting and adding the values, and then produce the final number.

你可以用 Array.prototype.reduce

// Your code, unchanged
var arrLimit = 39; 
var newArray = [];

for(i = 1; i <= arrLimit; i += 2) {     
    newArray.push(4/i);
}

// reduce the array to the final result
// (2*(-i%2)+1) alternates between `-1` and `1`.
var result = newArray.reduce( (prev,curr,i) => prev + (2*(-i%2)+1)*curr );
console.log( result );

首先取消数组并能够 "calculate" pi 使用任意多的术语如何?

let pi = 0,
    terms = 100;

for (var i = 0; i < terms; i++){
  pi += 4/(2*i + 1) * ( i % 2 == 0 ? 1 : -1)
}

console.log(pi);

建的时候可以看看newArray的长度,乘以-1或者+1

var arrLimit = 39; 
var newArray = [];

for(i = 1; i <= arrLimit; i += 2) {   
  newArray.push(4 / i * (newArray.length % 2 ? 1 : -1));
}

console.log(newArray);