Javascript-来自字符串的阶乘

时间:2018-08-17 20:04:25

标签: javascript regex

我正在尝试制作一个简单的脚本来计算阶乘。因此,例如,如果输入“ 2!+5!+4”,您将得到“ 2 + 120 + 4”。我不知道你会怎么做。

WebAuthentication

3 个答案:

答案 0 :(得分:4)

只需用\d+部分(应分组)的阶乘结果替换!后跟\d+的所有出现:

var result = mathString.replace(/(\d+)!/g, function(match, number) {
    return factorial(+number);
});

使用箭头功能缩小:

var result = mathString.replace(/(\d+)!/g, (m, n) => factorial(+n));

示例:

function factorial(num) {
  if (num <= 1) 
    return 1;

  return num * factorial(num - 1);
}

var mathString = "2!+5!+4";
var result = mathString.replace(/(\d+)!/g, (m, n) => factorial(+n));
console.log(result);

注意:不在乎析因位前面是否有-+,因为它将保留在那里,因此正则表达式检索到的数字将始终是>= 0,因此factorial函数可以简化(请参见代码段)。

答案 1 :(得分:1)

您需要将+放在捕获组中,而不要放在捕获组之后。

var facregex = /(\d+)!/g;

它们都匹配所有数字,但是您的版本仅捕获第一个数字,而不是所有数字。

您不需要for循环,因为您可以将函数赋予replace()函数。它接收匹配项和所有捕获组作为参数,并返回替换项。

var origValue = "2!+10!+4";
var facregex = /(\d+)!/g;

var calcValue = origValue.replace(facregex, function(match, group1) {
    return factorial(Number(group1));
});

console.log(calcValue);

function factorial(num) {
  if (num < 0)
    return -1;
  else if (num == 0)
    return 1;
  else {
    return (num * factorial(num - 1));
  }
}

答案 2 :(得分:1)

1。。在将!(Sign)解析为facmatch[i]之前,先替换Number

2。。使用eval字符串结果中获得最终计算

function factorial(num) {
      if (num < 0) 
          return -1;
      else if (num == 0) 
        return 1;
      else {
        return (num * factorial(num - 1));
      }
  }

var calcvalue = "2!+5!+4";
var facregex = /(\d)+\!/gi;
var facmatch = calcvalue.match(/(\d)+\!/gi);
var faclength = calcvalue.match(/(\d)+\!/gi).length;
//console.log(faclength,facmatch);
for (var i = 0; i < faclength; i++) {
var fact=factorial(Number(facmatch[i].replace("!","")));
//console.log("Final: "+fact);
calcvalue= calcvalue.replace(facmatch[i], fact);

} 
console.log("Final: "+eval(calcvalue));