我正在尝试创建一个在JavaScript中执行Sigma符号计算的函数。 (如果您不知道Sigma符号,那么我将在下面清楚地了解我的目标。)我的目标是创建一个可以像Sigma符号一样轻松编写的函数,并返回Sigma符号计算的解决方案。理想情况下,我希望调用函数只需要提供起始值,结束值以及对数字集中的每个数字执行的计算,然后将它们相加为参数。
例如,
thisIsMySigmaNotationFunction(1, 4, 2i+1)
将返回:
(2(1)+1) + (2(2)+1) + (2(3)+1) + (2(4)+1) = 24
这是我到目前为止创建的代码,但是我必须创建一个单独的函数作为2i + 1参数。我想知道是否有办法避免这种情况并按上述方式调用函数,因为2i + 1可能需要更改为i /(i + 1)或将来的其他计算,所以不必创建每次都作为参数插入的单独函数。
function sigmaCalculation(start, end, whatToSum){
var sum = 0;
for (var i = start; i <= end; i++){
sum += whatToSum(i);
};
console.log(sum);
}
function calculationToSum(this1){
return 2*this1+1;
}
答案 0 :(得分:1)
如果它有帮助,那么每次调用时都不需要创建命名函数,可以使用匿名函数:
sigmaCalculation(1, 4, function(x) { return 2 * x + 1; });
哪个可以非常紧凑。
现在,如果您想i/(i+1)
,请将呼叫更改为:
sigmaCalculation(1, 4, function(x) { return x / (x + 1); });
答案 1 :(得分:1)
添加匿名功能即可完成这项工作。每次调用函数时,我们甚至可以通过更改函数调用中的计算来执行不同的计算。
EXTRACT(EPOCH FROM (i.intime-p.dob)::INTERVAL)/86400 as age
输出:24
答案 2 :(得分:0)
为了能够使用基于字符串的输入而不是函数,您可以使用JavaScript的eval
:
function sigmaCalculation(start, end, whatToSum){
var sum = 0;
for (var i = start; i <= end; i++){
sum += eval(whatToSum.replace("i", i));
};
console.log(sum);
}
sigmaCalculation(0, 5, "2*i+1");
请注意,这不是很安全,特别是在从用户那里获取输入时,因为eval
基本上运行任何和所有JavaScript代码。
答案 3 :(得分:0)
thisIsMySigmaNotationFunction(1, 4, 2i+1)
这在语法上是无效的。避免传递函数的唯一方法(比如@ MattBurland的答案)是动态创建函数,例如从一个字符串。我已经基于Osteele's functional
library构建了一个小帮助函数:
function F(body) {
var args = body.match(/2i+1/g).sort();
return new Function(args, "return "+body.replace(/(\d+)([a-z])/g, "$1*$2"));
}
有了这个,你可以写
thisIsMySigmaNotationFunction(1, 4, F("2i+1"))
答案 4 :(得分:0)
Arrow函数现在使此操作不再那么烦人了。
function sigma(start, end, modifier) {
const length = end - start + 1;
const map = (v, k) => modifier ? modifier(k + start) : k + start;
const sum = (a, b) => a + b;
return Array.from({ length }, map).reduce(sum);
}
sigma(3, 5); // 12
sigma(3, 5, i => i+2); // 18
sigma(3, 5, i => i*2); // 24
sigma(3, 5, i => i/(i+1)); // 2.3833333333333333