Параметризация рекурсивного метода без глобальной переменной

В качестве примера мы прочесываем перестановки целого числа 123456789. Вдохновленный Алгоритм кучи, у нас есть следующие

public static ArrayList<String> comb(char[] seq, int n, ArrayList<String> box){
        if (n == 1){
            if (isSquare(Integer.valueOf(String.valueOf(seq)))) {
                box.add(String.valueOf(seq));
            }
        } else {
            for(int i=0; i<n; i++){
                comb(seq,n-1, box);
                int j;
                if ((n%2)==0) {
                    j = i;
                } else {
                    j = 0;
                }
                char temp = seq[n-1];              
                seq[n-1] = seq[j];
                seq[j] = temp;                
            }
        }
        return box;
    }

В данном случае нас интересует, является ли конкретная перестановка квадратом целого числа. Осуществлено

public static boolean isSquare(int n) {
    if ((n%10)==2 || (n%10) ==3 || (n%10)==7 || (n%10) == 8) {
        return false;
    } else if ( (Math.sqrt(n)) % 1 ==0) {
        return true;
    } else {
        return false;
    }
}

Однако, чтобы иметь возможность использовать comb, я должен инициализировать пустой массив вне метода. Что мне делать, чтобы избежать необходимости в глобальной переменной? Я все еще хотел бы получить box со всеми решениями. Я понимаю, что моя ошибка заключается в параметризации comb.

«Я должен инициализировать пустой массив вне метода. Что мне делать, чтобы избежать необходимости в глобальной переменной?» Передайте его как параметр.

Andy Turner 09.10.2018 20:09

Проблема на самом деле не в необходимости создания массива вне метода, вы можете это обойти. Но проблема в том, что вы изменяете ArrayList а также в массив seq, изменяя (содержимое) ваших параметров, как правило, не одобряют, потому что вызывающий может / не ожидает этого.

luk2302 09.10.2018 20:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
66
1

Ответы 1

Создайте функцию, которая «обертывает» исходную рекурсивную функцию, предоставляет ей все необходимые параметры и при необходимости создает копии объектов:

Допустим, вы переименовали свою функцию comb(...) в combRecursive(...) для удобства именования.

public static ArrayList<String> comb(char[] seq, int n){
    char[] seqCopy = Arrays.copyOf(seq, seq.length);
    return combRecursive(seqCopy, n, new ArrayList());
}

Другие вопросы по теме