我尝试使用Gregory-Leibniz series创建计算PI的公式。我已经创建了一个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并在减去和添加值之间交替,然后生成最终数字。
答案 0 :(得分:2)
您可以使用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));
答案 1 :(得分:0)
保留一个额外的变量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);
}
我个人赞成第二种方法,但两种方法都很好。
答案 2 :(得分:0)
您可以添加额外的变量。如果你想要,你可以在同一时间总和。
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
}
答案 3 :(得分:0)
执行此操作我需要一些方法来获取newArray并在减去和添加值之间交替,然后产生最终数字。
// 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 );
&#13;
答案 4 :(得分:0)
如何首先取消阵列并且能够&#34;计算&#34;拥有你喜欢的任意数量的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);
&#13;
答案 5 :(得分:0)
您可以在构建时查看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);
&#13;