更换!在 Javascript 中具有阶乘函数的字符串中

Replacing ! in a string with factorial function in Javascript

我正在尝试用 Javscript 构建一个计算器,并且已经实现了所有常用运算符。现在我想实现一个阶乘 (!) 运算符。

我定义了一个 factorial(n) 函数,现在我想替换 !使用我的函数,然后在结果字符串上使用 eval() 并显示输出。 我可以实现它向后迭代,但它不适用于括号。

这是我的代码 -

function replaceFactorial(expression) {
    expression = expression.replace(' ', '');
    index = expression.indexOf('!');
    number = '';
    for (let i = index - 1; i >= 0; --i) {
        if (!(['+', '-', '*', '/'].includes(expression.charAt(i)))) {
            number += expression.charAt(i);
        } else {
            break;
        }
    }
    console.log(number + '!', 'factorial(' + number + ')')
    expression = expression.replace(number + '!', 'factorial(' + number + ')');
    return eval(expression);
}

例如:
factorial('5! + 5') 输出 125。正如预期的那样,但是
factorial('(2 + 3)!') 无效!

在我的方法中,我从 !到达接线员后,停止并更改号码。但是当我有括号时它不起作用。

我怎样才能让它发挥作用?

您可以使用正则表达式来查找数字和后面的爆炸,两者都分组。然后使用第二个参数调用 factorial 的函数。

function factorial(n) { return +!n || n * factorial(n - 1); }

const
    string = '5! + 2!'

console.log(string.replace(/(\d+)(!)/g, (_, v) => factorial(v)));

另一种思路是将factorial定义为Number的原型方法。替换变得非常微不足道:每个“!”可以替换为 ["factorial"]():

"use strict"; // To avoid this-wrapping overhead (optional)

Number.prototype.factorial = function () {
    return this > 0 ? this * (this-1).factorial() : 1;
}

function evaluate(str) {
    str = str.replaceAll("!", '["factorial"]()');
    console.log(str); // Just to see what it generates
    return eval(str);
}

console.log(evaluate("1 + (2*3)!")); // 721
console.log(evaluate("3!!-1")); // 619
console.log(evaluate("(2-2)!*3")); // 3
console.log(evaluate("'abc'.length!")); // 6