Один из возможных подходов (не обязательно самый эффективный) может заключаться в том, чтобы использовать подход разделения и покорения. Сравнительно просто найти все перестановки двух групп (самый тупой путь просто вложен для циклов). Предположим, вы пишете функцию с именем permute
и permute(A,B)
, где A (например, {(1), (2), (3)}) и B (например, {(4), (5)} являются группами чисел, и она возвращает вы все перестановки A & B как одна группа (например, {(1,4), (1,5), (2,4), (2,5), (3,4), (3,5) }).
Итак, если у вас есть N групп вместо 2, проще всего просто выделить небольшие части проблемы. Предположим, у вас есть группы A, B и C. Вместо того, чтобы беспокоиться о них все отдельно , вы можете думать об этом как о чем-то вроде:
permute(permute(A,B),C)
Найти все перестановки A и В первую очередь. После того как вы этот результат, найти все перестановки этого результата с С. И четыре группы A, B, C, D может выглядеть следующим образом:
permute(permute(permute(A,B),C),D)
И так далее. На каждом шаге по пути вы берете текущий результат перестановки и переставляете его следующей группой в списке групп, которые вы получили в качестве входных данных. Вы объединяете только две группы одновременно, поэтому алгоритм не должен меняться в зависимости от количества групп, которые вы получаете в качестве входных данных.
Когда вы делаете рекурсию, есть несколько основных вопросов, которые нужно ответить:
Вы можете рекурсивно разбить задачу на более мелкие, решаемые задачи? Я думаю, что приведенные выше примеры доказывают, что вы можете.
Что такое базовый корпус? Каково решение, которое заставит рекурсию остановиться и расслабиться? Обычно это должно быть что-то действительно простое, что ваша рекурсия может сработать. В этом случае это, вероятно, сводится к чему-то вроде permute(A,{})
, где {} - пустой набор.
Что такое рекурсивный случай?Как вы отделите кусок проблемы и отнеситесь к меньшему подмножеству проблемы? Я думаю, что первоначальное объяснение дает вам один способ потенциально сделать это. Просто прерывайте одну группу за раз и переставляйте ее с вашим постоянно растущим результатом.
Есть, конечно, другие решения этой проблемы, это только первое, что появилось в моей голове. По мере того, как N становится все больше и больше, этот алгоритм будет становиться слишком медленным, поскольку он не очень эффективен.
Так что, даже если вы не используете это решение, я надеюсь, что он поможет вам на правильном пути!
Вы ищете декартово произведение в java, возможный дубликат [Декартово произведение произвольных множеств в Java] (http://stackoverflow.com/questions/714108/cartesian-product-of -arbitrary-sets-in-java) –