Перечислите все перестановки чисел 1`` n в лексикографическом порядке

Я пытаюсь запрограммировать Matlab, чтобы перечислить все перестановки чисел от 1 до n в лексикографическом порядке. То, что у меня есть, ниже. Я использую рекурсию, чтобы попытаться сначала написать программу, которая будет работать для n = 3, а затем посмотреть, смогу ли я получить представление о написании программы для любого n. Пока у меня есть 2 из 6 столбцов для n = 3: P=[1 2 3;1 3 2]. Мне нужны следующие два столбца, чтобы просто поменять местами единицы и двойки. Я не знаю, с чего начать.

function [P] = shoes(n)

if n == 1
    P = 1;
elseif n == 2
    P = [1 2; 2 1];
else 
    T = shoes(n-1) + 1;
    G = ones(factorial(n-1),1);
    P(1:2,1:3) = [G T];               
end

person Community    schedule 15.03.2009    source источник
comment
Пометьте вопросы о домашнем задании меткой "домашнее задание". Спасибо.   -  person Mitch Wheat    schedule 15.03.2009
comment
Я был бы счастлив. Вы можете мне сказать как?   -  person    schedule 15.03.2009


Ответы (2)


Для начала см. документацию. Если под лексикографическим порядком вы имеете в виду алфавитное по английскому имени, вы можете захотеть заполнить свой ввод именами, отсортировать их, а затем переставить.

Если я неправильно понял, что вы хотите, прокомментируйте или отредактируйте вопрос, и я проверю позже.

Подсказки:

  • Перестановки пустого списка легко найти.
  • Индукция - важное понятие в математике. Вы должны быть с ним знакомы.
  • Среда, в которой вы работаете, поддерживает рекурсию
  • Перестановки более длинного списка могут быть произведены в желаемом порядке рекурсией; сначала выясните, каким должен быть первый элемент, а затем выясните все остальное.

Если вы снова застряли, отредактируйте вопрос, указав, что вы уже получили и где / почему вы думаете, что застряли.

Подсказки после просмотра вашего кода.

  • Ваша основная функция переставляет вектор, поэтому в качестве аргумента должен приниматься вектор, а не целое число.
  • Не начинайте решать случай n = 3; попробуйте случай n = 0 (это []), а затем сразу переходите к случаю n = 20.
  • Подумайте о случае n = 20, прежде чем писать какой-либо код. Как будет выглядеть первая колонка? Есть ли какие-нибудь примеры случая n = 19, скрытые в ответе на случай n = 20? (Ответ - да, и все они разные).
  • Перечитайте первый набор подсказок
person MarkusQ    schedule 15.03.2009
comment
Привет и спасибо за быстрый ответ. На самом деле мне не разрешено использовать встроенные функции perms. И чтобы уточнить, что мне нужно сделать, это, например, если n = 3, результат должен быть точно A = [1 2 3; 1 3 2; 2 1 3; 2 3 1; 3 1 2; 3 2 1] . Это более ясно? - person ; 15.03.2009
comment
Отметьте это тегом домашнего задания, и я вернусь позже. А пока добавлю подсказку. - person MarkusQ; 15.03.2009

Похоже, вы задали этот вопрос дважды. Вместо того, чтобы повторно размещать вопросы, вы должны просто щелкнуть ссылку «изменить» под своим вопросом и обновить ее. Я репостю здесь ответ, который я дал на ваш другой вопрос, но вам действительно стоит удалить один из них.


Если у вас есть следующая матрица:

A = [1 2 3; 1 3 2];

и если вы хотите, чтобы все единицы стали двойками, а двойки стали единицами, самый простой способ сделать это:

B = A;
B(A == 1) = 2;
B(A == 2) = 1;
person gnovice    schedule 15.03.2009
comment
Привет, я просто хочу сказать большое спасибо за твою помощь. Этот единственный ответ позволил мне написать всю программу. Я очень ценю это. - person ; 15.03.2009