Java Рекурсивно добавить в список - PullRequest
1 голос
/ 02 июля 2019

Все вроде нормально, но в этой строке есть ошибка:

return new ArrayList<Integer>(Arrays.asList(i, FACTORISATION(n/i)));

Ошибка: конструктор ArrayList (Arrays.asList (i), ArrayList) не определен

Я понимаю, что ошибка говорит о том, что метод Array asList не принимает ArrayList, но тогда как я могу добавить элементы, возвращенные FACTORISATION, в список? Эта рекурсия действительно портит мою голову

1 Ответ

3 голосов
/ 02 июля 2019

Java на самом деле не является функциональным языком программирования, поэтому написание такого функционального кода, как правило, немного неуклюже.

Вы хотите что-то вроде этого:

public static List<Integer> FACTORISATION(int n) {
    if (PRIME(n)) {
        // return a one-element array
        return Collections.singletonList(n);
    } else {
        // find a prime divisor, p
        for (int i = 2; i < Math.sqrt(n); i++) {
            List<Integer> newList = new ArrayList<>();
            newList.add(i);
            newList.addAll(FACTORISATION(n/i));
            return newList;
        }
        return Collections.emptyList();
    }
}

Примечание. Я изменил на тип интерфейса List<Integer>, а также на Collections.singletonList.

Если вы можете использовать Guava, попробуйте ImmutableList, который немного элегантнее.

public static List<Integer> FACTORISATION(int n) {
    if (PRIME(n)) {
        // return a one-element array
        return ImmutableList.of(n);
    } else {
        // find a prime divisor, p
        for (int i = 2; i < Math.sqrt(n); i++) {
            return new ImmutableList.Builder<Integer>()
                .add(i)
                .addAll(FACTORISATION(n/i))
                .build();
        }
        return Collections.emptyList();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...