Параметризация рекурсивного метода без глобальной переменной - PullRequest
0 голосов
/ 09 октября 2018

В качестве примера мы прочесываем перестановки целых чисел 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.

1 Ответ

0 голосов
/ 09 октября 2018

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

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

public static ArrayList<String> comb(char[] seq, int n){
    char[] seqCopy = Arrays.copyOf(seq, seq.length);
    return combRecursive(seqCopy, n, new ArrayList());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...