如何创建一个在JavaScript中执行Sigma符号计算的函数?

时间:2014-02-27 20:13:49

标签: javascript

我正在尝试创建一个在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;
}

5 个答案:

答案 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