Этот метод создает декартово произведение в обратном порядке, потому что оно создает произведение "наизнанку" - когда оно возвращается из рекурсии.
Распечатывает значение, возвращаемое каждым уровнем в рекурсии, и вы будете посмотрим, как это происходит.
Второй уровень рекурсии работает в списке B и возвращает [[4], [5]].
Первый уровень рекурсии занимает [[4], [ 5]] и использует метод list.add
для добавления элементов из списка A. Этот метод добавляет элементы в конец списка , поэтому получается результат [[4, 1], [5, 1] , [4, 2], [5, 2]].
Как это исправить?
Быстрое исправление - вставка элементов вперед, а не сзади. Вместо set.add(obj)
используйте:
set.add(0, obj);
Другой вариант - изменить порядок итерации , чтобы второй уровень рекурсии использовал список A, а первый уровень - список B. Первоначальный вызов для запуска рекурсии будет сделан с sets.size()
, и вместо обратного отсчета он должен быть:
return _cartesianProduct(sets.size() - 1, sets);
...
for (ArrayList<Double> set : _cartesianProduct(index - 1, sets)) {
Еще один вариант - изменить рекурсию, чтобы продукт был построен на пути вниз рекурсия - "снаружи" - а не на выходе. Этот подход используется в другом ответе на вопрос, на который вы ссылаетесь: { ссылка }