Код генерирует одну и ту же комбинацию дважды. Как ее улучшить? - PullRequest
0 голосов
/ 03 июня 2018

Код выглядит следующим образом:

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 раз?Я не знаю, где я иду не так.

1 Ответ

0 голосов
/ 03 июня 2018

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