Ищу оптимальный алгоритм комбинаций n элементов

алгоритмы комбинации

Хочу услышать ваши варианты комбинаций n элементов массива. Напомню, что это n! вариантов.
Пример 1:
Введите n=3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

Пример 2:
Введите n=4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
и т.д.

Примечание:
Артёмка, во-первых, перестановки и комбинации - разные вещи, не путайте)
Во-вторых, я хочу от вас алгоритм построения таблицы из всех возможных комбинаций n-элементов, зная только число n. Не обязательно, но желательно привести пример кода, но с комментариями)

Примечание:
Ладно, согласен, в данном случае можно оперироваться перестановками.

Примечание:
Пока лез искать, что я вам хотел сказать, нашел на паскале примерчик)
Артёмка, хорошо, давайте так, напишите пример кода с рекурсией для перестановок из n элементов.

Примечание:
Дополните, пожалуйста, код комментариями - и вопрос закрыт.
Ответы:
Найти перестановки для (n - 1) элемента и для каждой перестановки повтыкать n-ый элемент между элементами этой перестановки. А в чем вопрос-то вообще? Как реализовать поиск перестановок на языке программирования?
Для меня перестановка - это то, что написано в статье [1]. Будь добр, поделись, что такое комбинация, и чем она отличается от перестановки.
Да легко.
const t = 20;
var n: integer;
   a: array[1..t] of integer; {типа массив для вывода}
   b: array[1..t] of boolean; {типа массив, чтобы помечать числа, которые уже участвуют в перестановке}
procedure go(k: integer); {типа мегапроцедура, которая нам всё напечатает, параметр указывает на номер числа, который нужно запихнуть в массив}
var i: integer; {клевая локальная переменная}
begin
   if k = n + 1 then begin {ежели пихать числа уже некуда, выводим}
       for i := 1 to n do write(a[i], ' '); {типа сам вывод}
       writeln; {Was ist das???}
       exit; {больше в процедуре делать не фиг}
   end;
   for i := 1 to n do begin {бежим по массиву b}
       if not b[i] then begin {и, о чудо, находим число, которое еще не взяли}
           a[k] := i; {таки запихиваем его массив}
           b[i] := true; {и помечаем, что взяли его}
           go(k + 1); {мегапроцедура, вперед!}
           b[i] := false; {попользовался числом - положи на место}
       end;
   end;
end;
begin
   readln(n); {читаем число}
   go(1); {и попестофали}
end.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.