代码生成相同的组合 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
代码如下:
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