Судя по вашему редактированию, я понимаю, что у вас есть массив из четырех элементов.Ваш желаемый результат представляет собой комбинацию этих элементов и объединение одного или четырех элементов.Вывод может содержать элемент ввода более одного раза.Это правильная сводка?
Если это так, подумайте о своем выводе в четырех случаях: для вывода, сгенерированного из одного, двух, трех или четырех элементов.Для вывода, сгенерированного из n
элементов, у вас есть n^n
возможности.Для всех четырех этих случаев в совокупности это дает вам 1^1 + 2^2 + 3^3 + 4^4 = 288
возможных выходных данных.
Ваши 1-элементные выходные перестановки просто: 0, 1, 2, 3
Ваш 2-элементный выходперестановки могут быть сгенерированы псевдокодом:
for i = 0 to 3 {
for j = 0 to 3 {
next_permutation = {i, j}
}
}
Для вывода из 3 и 4 элементов перестановки могут быть созданы с использованием трех и четырех вложенных циклов соответственно.Для произвольного числа входных элементов x
вы можете генерировать перестановки, используя ту же технику с x
числом вложенных циклов.Имейте в виду, что количество циклов увеличивается экспоненциально с увеличением количества элементов ввода, поэтому это может быть довольно быстро.
Вы можете использовать числа из этих перестановок в качестве индексов в вашем исходном массиве, чтобы сгенерироватьвывод в виде строк (как в вашем примере).
Обновление: Вот рекурсивная функция псевдокода, которая может генерировать эти псевдоперестановки:
int output_array[dimension] = {0};
generate_combinations (unsigned dimension, int index) {
for i = 0 to (dimension-1) {
output_array[index] = i;
if index == 0
next_permutation = output_array
else
generate_combinations(dimension, index-1)
endif
}
}
Вы быиспользуйте это с dimension
, установленным на количество элементов в вашем входном массиве и index = dimension - 1
.Надеемся, что входная размерность не будет такой большой, что это будет слишком глубоко для вашего процессора.