代码生成相同的组合 twice.How 我可以改进它吗?

The code generates the same combination twice.How can I improve it?

代码如下:

package AG;

import java.util.LinkedList;
import java.util.Stack;

public class ArithmeticGame {

    public static void main(String[] args) {
        LinkedList<Integer> numbers = new LinkedList<>();
        LinkedList<Integer> number = new LinkedList<>();
        for (int i = 1; i <= 3; i++) {
            numbers.add(i);
        }
        permutateSigns('&', numbers, 0, "");
        permutateSigns('|', numbers, 0, "");

    }


    public static void permutateSigns(char operation, LinkedList<Integer> number, int pos, String expresion) {
        double sum = 0;
        if (pos == number.size()-1) {
            expresion += number.get(pos);
            System.out.println(expresion);
        } 
        else {
            expresion += (Integer.toString(number.get(pos)) + Character.toString(operation));
            permutateSigns('|', number, pos + 1, expresion);
            permutateSigns('&', number, pos + 1, expresion);
        }

    }
}

我从上面的代码得到的输出是:

1&2|3
1&2|3
1&2&3
1&2&3
1|2|3
1|2|3
1|2&3
1|2&3

如何才能只得到1次组合?我不知道我哪里错了。

假设当pos == number.size()-2时,你有一个部分表达式“1&2|”。

现在,由于 pos < number.size()-1,您调用:

permutateSigns('|', number, pos + 1, "1&2|");

permutateSigns('&', number, pos + 1, "1&2|");

两者都会看到 pos == number.size()-1 并打印相同的表达式 - "1&2|3"。

结论:

当您到达 List 的倒数第二个元素时,您应该只进行一次递归调用来打印最终表达式。

因此,而不是:

        expresion += (Integer.toString(number.get(pos)) + Character.toString(operation));
        permutateSigns('|', number, pos + 1, expresion);
        permutateSigns('&', number, pos + 1, expresion);

你可以写:

        expresion += (Integer.toString(number.get(pos)) + Character.toString(operation));
        permutateSigns('|', number, pos + 1, expresion);
        if (pos < number.size()-2) {
            permutateSigns('&', number, pos + 1, expresion);
        }

修复之后,您将得到输出:

1&2|3
1&2&3
1|2|3
1|2&3