Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 08.03.2019
Сообщений: 25
1

Генерация всех перестановок

09.03.2019, 13:46. Показов 743. Ответов 6

Author24 — интернет-сервис помощи студентам
Здравствуйте. Наткнулся на программу генерацию всех перестановок, и есть 2 момента, которые не могу понять. Объясните, пожалуйста.

1) Зачем нужно эта строка в гланой программе?
Pascal
1
2
  for j := 1 to n do
    b[j] := j;
2) Как работает эта строчка после процедуры generate(l+1,r,a) ?
Pascal
1
v := a[l]; a[l] := a[i]; a[i] := v;
С одной стороны я понял, что она возвращает пеерстановку на место
Было RGB, поменяется на RBG, наша строка возвращает RGB. Но также я не могу понять другой ее момент:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
b[3]= 3
 
l=r?13
before a[1]= 1
before a[1]= 1
 
aftef a[1]= 1
after a[1]= 1
 
 
l=r?23
before a[2]= 2  
before a[2]= 2   
 
aftef a[2]= 2
after a[2]= 2
 
 
l=r?33
1
red 
2
green 
3
blue 
before2 a[2]= 2     {Здесь равняет 2}
before2 a[2]= 2
aftef2 a[2]= 2
after2 a[2]= 2
 
before a[2]= 2
before a[3]= 3
 
aftef a[2]= 3
after a[3]= 2
 
 
l=r?33
1
red 
2
blue 
3
green 
before2 a[2]= 3
before2 a[3]= 2
aftef2 a[2]= 2       {Здесь произошло возвращение}
after2 a[3]= 3
 
before2 a[1]= 1     {Здесь равняет 1...Как???}
before2 a[1]= 1
aftef2 a[1]= 1
after2 a[1]= 1
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const
  n = 3; 
  fig: array[1..n] of string[10] = ('red', 'green','blue');
 
type
  mas = array[1..n] of byte;
procedure generate(l, r: integer; a: mas);
var
  i, v: integer;
begin
  writeln('l=r?',l, r );
  if (l = r) then
  begin
    for i := 1 to n do begin
      writeln(i);
      write(fig[a[i]], ' ');
    writeln;
  end;
  end
  else
  begin
    for i := l to r do
    begin
      writeln('before a[',l,']= ', a[l]);
      writeln('before a[',i,']= ', a[i]);
      writeln();
      v := a[l]; a[l] := a[i]; a[i] := v;
      writeln('aftef a[',l,']= ', a[l]);
      writeln('after a[',i,']= ', a[i]);
      writeln;
      writeln;
      generate(l + 1, r, a); 
      writeln('before2 a[',l,']= ', a[l]);
      writeln('before2 a[',i,']= ', a[i]);
      v := a[l]; a[l] := a[i]; a[i] := v; 
      writeln('aftef2 a[',l,']= ', a[l]);
      writeln('after2 a[',i,']= ', a[i]);
      writeln;
    end;
  end;
end;
 
var
  j: integer;
  b: mas;
 
begin
 
  for j := 1 to n do
    b[j] := j;
  generate( 1, n, b);
  readln
end.
Спасибо Вам за помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2019, 13:46
Ответы с готовыми решениями:

Генерация и запись всевозможных перестановок
Пишу процедуру для генерации всех возможных перестановок из n элементов и записи их в динамический...

Разработайте алгоритм для вывода всех возможных перестановок символов в строке
Разработайте алгоритм для вывода всех возможных перестановок символов в строке (считайте, что все...

Генерация всех перестановок элементов множества
Где можно взять алгоритм генерации всех перестановок элемента множества? Например, если M = {a, b,...

Генерация перестановок
Привет, я написал прогу для вывода в файл всех перестановок ряда чисел 1,2, ... ,n. Число n можно...

6
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
09.03.2019, 14:59 2
Цитата Сообщение от Jane_Jane Посмотреть сообщение
Зачем нужно эта строка в гланой программе?
Чтобы заполнить начальную расстановку: 1 2 3.
Цитата Сообщение от Jane_Jane Посмотреть сообщение
Как работает эта строчка после
Тупо меняет два элемента массива…
Её можно заменить на один оператор Swap(a[L],a[i]);
1
0 / 0 / 0
Регистрация: 08.03.2019
Сообщений: 25
09.03.2019, 15:28  [ТС] 3
JuriiMW, Получается, сначала печатает:
1) red, green, blue
А потом меняет на:
2) red, blue, green
Здесь в выводе можно увидеть, что программа возвращает первоначальную строку(1):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
l=r?13
before a[1]= 1
before a[1]= 1
 
aftef a[1]= 1
after a[1]= 1
 
 
l=r?23
before a[2]= 2
before a[2]= 2
 
aftef a[2]= 2
after a[2]= 2
 
 
l=r?33
1
red 
2
green 
3
blue 
before2 a[2]= 2
before2 a[2]= 2
aftef2 a[2]= 2
after2 a[2]= 2
 
before a[2]= 2
before a[3]= 3
 
aftef a[2]= 3
after a[3]= 2
 
 
l=r?33
1
red 
2
blue 
3
green 
before2 a[2]= 3
before2 a[3]= 2
aftef2 a[2]= 2
after2 a[3]= 3
А почему потом происходит перестановка:
green, red, blue
Pascal
1
2
3
4
before2 a[1]= 1
before2 a[1]= 1
aftef2 a[1]= 1
after2 a[1]= 1
Там же было 2 и 3, как оно в 1 и 1 превратилось?
0
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
09.03.2019, 15:47 4
Я ни чего не могу увидеть, т.к. ваша программа загажена всякими лишними выводами!
Убирайте все и пользуйтесь отладчиком:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const
  n = 3; 
  fig: array[1..n] of string[10] = ('red', 'green','blue');
 
type
  mas = array[1..n] of byte;
 
procedure generate(l, r: integer; a: mas);
begin
  if l = r then
    begin
      for var i := 1 to n do fig[a[i]].print;
      writeln;
    end
  else
    for var i := l to r do
      begin
        Swap(a[L], a[i]);
        generate(l+1, r, a); 
        Swap(a[L], a[i]);
      end;
end;
 
begin
  var a : mas;
  for var i := 1 to n do a[i] := i;
  generate(1, n, a);
end.
Вот теперь программа выводит то, что нужно!

Добавлено через 5 минут
Ну и зачем здесь этот промежуточный „костыль“ fig—a?
И не нужен лишний параметр процедуры!

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const
  n = 3;
  
var
  a : array of String := ('red', 'green','blue');
 
procedure generate(L : integer; a : array of String);
begin
  if L = n-1 then
    begin
      a.Println;
    end
  else
    for var i := L to n-1 do
      begin
        Swap(a[L], a[i]);
        generate(L+1, a); 
        Swap(a[L], a[i]);
      end;
end;
 
begin
  generate(0, a);
end.
Добавлено через 2 минуты
О! Да! Ещё константа…
Не нужна константа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
  a : array of String := ('red', 'green', 'blue', 'magenta');
 
procedure generate(L : integer; a : array of String);
begin
  if L = a.Length-1 then
    begin
      a.Println;
    end
  else
    for var i := L to a.Length-1 do
      begin
        Swap(a[L], a[i]);
        generate(L+1, a); 
        Swap(a[L], a[i]);
      end;
end;
 
begin
  generate(0, a);
end.
0
0 / 0 / 0
Регистрация: 08.03.2019
Сообщений: 25
09.03.2019, 15:59  [ТС] 5
JuriiMW, лишние выводы мне былы нужны из-за того, что было непонятно, как рекурсивная процедура выполняется...
Pascal
1
2
3
4
5
6
7
red green blue magenta{Здесь вывод первой строки}
red green magenta blue{Здесь обмен третьей и четвертой переменнами}
red blue green magenta{Не понимаю, почему так...}
red blue magenta green
red magenta blue green
red magenta green blue
green red blue magenta{Здесь тоже не понимаю, почему green встал на первое место}
В ABC.net, можно ли не видеть шаги, которые выполняются в PABCSystem.pas, а то очень долго всё выполняется...
0
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
09.03.2019, 16:41 6
Цитата Сообщение от Jane_Jane Посмотреть сообщение
можно ли не видеть шаги, которые выполняются в PABCSystem.pas, а то очень долго всё выполняется
Я так понимаю вы про отладку...

В отладке есть 3 способа выполнить программу немного дальше и снова поставить на паузу:

1. Поставить точку останова (тыкните слева, появится красный кружочек) и нажать F9. Программа будет выполнятся пока не дойдёт до первой точки останова.

2. Нажать F7. Если сейчас отладка стоит на вызове подпрограммы - она перейдёт внутрь этого вызова. Если нет - перейдёт на следующую строчку.

3. Нажать F8. В отличии от F7, F8 не попытается перейти внутрь вызова подпрограммы, а всегда только перейдёт на следующую строчку.
1
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
09.03.2019, 17:04 7
Цитата Сообщение от Sun Serega Посмотреть сообщение
F8 не попытается перейти внутрь вызова подпрограммы,
Не „не попытается“, а „не будет входить“…
Но с оговоркой!
Скажем, если внутри подпрограммы будет точка останова, то программа прервётся внутри подпрограммы.

Т.е., если поставить в последней программе точку останова на шестой строке
Pascal
6
  if L = a.Length-1 then
то можно легко отлаживать всё с помощью клавиши F8 не проваливаясь в PABCSystem.
0
09.03.2019, 17:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2019, 17:04
Помогаю со студенческими работами здесь

Процедура печати всех перестановок из n символов - перевод с C++
Есть программа работает как мне надо, только она на С++. А переделать не получается. Может кто...

Схема алгоритма получения (печати) всех перестановок из n чисел
Помогите пожалуйста, нужна блок схема и код алгоритма получения (печати) всех перестановок из n...

Дано n различных натуральных чисел. Написать функцию нахождения всех перестановок этих чисел.
Дано n различных натуральных чисел. Написать функцию нахождения всех перестановок этих чисел....

Генерация всех подмножеств заданного n-элементного множества
помогите найти ошибку в коде задание было "Генерировать все подмножества заданного N-элементного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru