Как насчет рекурсивного алгоритма, который вы можете вызывать итеративно?Если вам действительно нужен этот материал в виде такого списка (вы должны четко указать это, а не выделять кучу бессмысленной памяти).Вы можете просто рассчитать перестановку на лету, по ее индексу.
Подобно тому, как перестановка представляет собой сложение «несущий-один», возвращающее хвост (а не возвращающееся к 0), индексация определенного значения перестановки находит цифры числа в базе n, а затем n-1n-2 ... через каждую итерацию.
public static <T> boolean permutation(List<T> values, int index) {
return permutation(values, values.size() - 1, index);
}
private static <T> boolean permutation(List<T> values, int n, int index) {
if ((index == 0) || (n == 0)) return (index == 0);
Collections.swap(values, n, n-(index % n));
return permutation(values,n-1,index/n);
}
Логическое значение возвращает ли значение индекса вне пределов.А именно, в нем заканчивалось n значений, но оставался оставшийся индекс.
И он не может получить все перестановки для более чем 12 объектов.12!
- Но это очень, очень красиво.И если вы делаете много плохого, это может быть полезно.