繁体   English   中英

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

[英]How do you create a function that performs Sigma notation calculations in 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;
}

如果它有帮助,您不需要每次调用时都创建命名函数,您可以使用匿名函数:

sigmaCalculation(1, 4, function(x) { return 2 * x + 1; });

这可以非常紧凑。

现在,如果您想做i/(i+1) ,只需将您的电话更改为:

sigmaCalculation(1, 4, function(x) { return x / (x + 1); });

箭头函数现在使这不那么烦人了。

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

添加匿名函数即可完成这项工作。 通过在函数调用时更改计算,我们甚至可以在每次调用函数时执行不同的计算。

function sigmaCal(start, end, calculation){
  var sigma=0;
  for(var i=start; i<=end; i++){
    sigma += calculation(i);
  }
  console.log(sigma);
}

sigmaCal(1,4, function(x){ return 2*x +1;});

输出:24

为了能够使用基于字符串的输入而不是函数,您可以使用 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 代码。

thisIsMySigmaNotationFunction(1, 4, 2i+1)

这在语法上是无效的。 避免传递函数(如@MattBurland 的答案)的唯一方法是动态创建函数,例如从字符串。 我已经基于Osteele 的functional构建了一个小辅助函数:

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"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM