[英]How do I create a text box with a submit button that performs a callback on click to a javascript function using js or jQuery?
[英]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.