Предположим, что когда 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