查找一组数字和运算符的所有排列

时间:2016-01-19 19:57:04

标签: javascript recursion permutation

我接受了代码挑战,这与递归有关并且无法完成。我对这些类型的问题的经验非常渺茫,这个问题让我很难过。你们中的任何人都可以帮助我完成我自己的教育,因为我已经完成了挑战吗?

描述:

给定一串数字和运算符,打印出所有不同的方法,您可以添加括号以强制显式操作顺序,以及按顺序运行操作的结果。

假设: 没有奇怪的输入,一切都被一个空间隔开。 支持的运算符是+,*, - ,=(对于=运算符,如果值相同则返回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);

1 个答案:

答案 0 :(得分:1)

一点提示:

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
}

这个实现仍然有一些错误&#34;和这些意图;我不打算做你的作业&#34;。

如果你的Equasion中有两个以上的运算符,结果将包含重复项,第二个它没有排序,并且因为它只是拆分和连接字符串,所以它无法计算任何结果。

但它向您展示了如何实现递归。