Можно ли вывести перестановки 1,…, n, используя только итераторы?

Вот пара примеров в псевдокоде, чтобы показать, что я имею в виду.

Это дает комбинации ( выборки без учета порядка без повторения) 1, ..., n, принимая 3 за раз.

Do[Print[i,j,k], {i,1...n-2}, {j,i+1...n-1}, {k,j+1...n}]

Цикл работает слева направо - для каждого i итератор j перебирает свои значения, а для каждого j итератор k перебирает свои. Добавляя больше переменных и изменяя n, мы можем обобщить то, что у нас есть выше.

Вопрос: можем ли мы сделать то же самое для перестановок? Другими словами, можем ли мы найти способ настроить итераторы для получения P (n, k) = n! / (Pk)! перестановки 1, ..., n? Для k = 3,

Do[Print[i,j,k], {i, f_1 , g_1(i,n)}, {j, f_2(i), g_2(i,j,n)}, {k, f_3(i,j), g_3(i,j,k,n)}]

Используйте только базовые арифметические операции и такие вещи, как модульная арифметика, пол / потолок fcns.

Поскольку это может показаться вам домашним заданием, я бы остановился на ответе «ура» или "нет"; Ваша оценка уровня сложности также мне пригодится.

Спасибо.

1
задан andrz 29 September 2011 в 20:00
поделиться