генерация перестановки в одиночку будут представлять собой хорошее домашнее задание, не говоря уже о вынужденной рекурсии и номер телефона отвлечение.
Небольшое количество перестановок может быть эффективно сгенерировано способом, аналогичным sorting networks. Последовательность n элементов имеет n! перестановки (при условии, что полный ничья, с каждой перестановкой, состоящей из n элементов). Заметим, что для последовательности из двух элементов, существуют две перестановки:
- первоначальную последовательность, и
- два элемента меняются местами.
Для получения последовательности из трех элементов, существует шесть перестановок:
- перестановка два нижних элементов, то
- вращать последовательность одно право клеток (или слева) и
- перестановки нижних двух элементов, затем
- поверните последовательность на одну ячейку слева (или справа, напротив выше) и
- перестановки бо ttom два элемента.
То есть, это двухэлементная версия, выполняемая три раза, с двумя промежуточными преобразованиями.Теперь последовательность из четыре элемента имеет двадцать четыре перестановки:
- перестановки три нижних элементов, то
- сохранить положение 1, присваивают от 0 до 1, от 3 до 0, и сохраненного значения для 3 и
- перестановки трех нижних элементов, то
- позиции своп 0 и 2, своп позиции 1 и 3 (или повернуть вправо на 2) и
- перестановки трех нижних элементов, то
- сохранить позицию 3, назначить от 2 до 3, 0 до 2, а сохраненное значение - 0 и
- перестановки нижних трех элементов.
Вы видите, как выглядит шаблон? Обратите внимание на рекурсивный характер решения?
Выше четырех элементов, узоры сложнее обнаружить. Вы можете выполнить итерацию последовательности, заменяя выбранный элемент последним элементом, изменяя последовательность, каждый раз расширяя нижние 24 перестановки.
Попробуйте записать его на бумаге, записав шаги, которые вы предпринимаете, чтобы перетасовать элементы, и вы обнаружите, что написали нужную вам программу.
Примечание также, что большинство решений, размещенных здесь используют тип String
и держать измельчения его и повторной сборке его. String
- это плохой выбор, учитывая, что он неизменен, когда генерация перестановок лучше всего делать путем замены и поворота элементов в векторе (на самом деле, ring).
Это редкий случай, когда вы действительно должны писать буквы в поток назначения, поэтому смещайте свое решение против этой операции. Используйте массив символов и записывайте символы в поток один за другим, когда пришло время испускать определенную перестановку. Формирование строки только для сброса записи в поток включает ненужное выделение и копирование.
Это домашнее задание? – Bozho
Зачем вам нужна рекурсия? – jheddings
Он этого не делает. Однако учитель делает это. –