更换!在 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
我正在尝试用 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