我遇到了一个与递归相关的代码挑战,无法完成它。我在这类问题上的经验很少,这个问题把我难倒了。你们中有谁可以仅仅为了我自己的教育而帮助我,因为我已经失败了挑战?
描述:
给定一个由数字和运算符组成的字符串,打印出您可以添加括号的所有不同方法,以强制显式地显示操作的顺序,以及按该顺序运行操作的结果。
假设:没有奇怪的输入,所有内容都由一个空格分隔。支持的运算符有+、*、-、=(对于=运算符,如果值相同,则返回1,否则返回0)打印以数字排序的结果不要担心输入表达式太大您的代码应该用javascript编写不要使用eval或外部库
示例:
node test.js "2 - 1 - 1"
((2-1)-1) = 0
(2-(1-1)) = 2
node test.js "2 * 3 - 4 * 5";
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10
node test.js "2 + 2 = 2"
((2+2)=2) = 0
(2+(2=2)) = 3这就是我到目前为止所在的地方。我还远没有得到正确的输出,但我觉得逻辑已经开始实现了。我从一个类似但不同的问题中改编了这段代码。
var args = process.argv.slice(2)[0].split(" "),
numberOfOperators = 0;
args.forEach(function(val, index, array) {
if (isNaN(val)) {
++numberOfOperators;
}
});
args = args.join("");
var recurse = function(openParenCount, closeParenCount, input, pointer) {
if (openParenCount === 0 && closeParenCount === 0) {
console.log(input + "\n");
}
if (openParenCount > 0) {
input = input.slice(0, pointer) + "(" + input.slice(pointer, input.length);
recurse(openParenCount - 1, closeParenCount + 1, input, pointer+1);
}
if (closeParenCount > 0) {
input = input.slice(0, pointer+openParenCount+3) + ")" + input.slice(pointer+openParenCount+3, input.length+1);
recurse(openParenCount, closeParenCount - 1, input, pointer+3);
}
}
recurse(numberOfOperators, 0, args, 0);发布于 2016-01-20 10:49:53
一个小提示:
var AP = [];
var input = process.argv.slice(2)[0];
var args = input.replace(/\s+/g, "").split(/([^\d\.]+)/g);
recurse(args, []).forEach(function(v){ console.log(v); });
function recurse(arr, into){
if(arr.length === 1){
into.push(arr[0]);
}else{
for(var i=0, j=arr.length-2; i<j; i+=2){
recurse(
AP.concat(
arr.slice(0, i),
"(" + arr.slice(i, i+3).join(" ") + ")",
arr.slice(i+3)
),
into
)
}
}
return into
}这个实现仍然有一些“bug”,这些都是故意的;我不打算做你的“家庭作业”。
如果你的等式中有两个以上的运算符,结果将包含重复项,第二,它不会排序,因为它只是拆分和连接字符串,所以它不能计算任何结果。
但它向您展示了一种实现递归的方法。
https://stackoverflow.com/questions/34885838
复制相似问题