Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2015, 21:15   #1
anton_guitar
 
Регистрация: 06.01.2015
Сообщений: 8
Лампочка Рекурсия (код почти готов, нужна небольшая доработка)

Всем доброго времени суток. Суть задачи такова, необходимо вывести все возможные перестановки заданных целых чисел и кол-во самих перестановок. Допустим, указали 3 числа: 1, 2 и 3. Программа выведет 123, 132, 213, 231, 312, 321. Моя проблема заключается в том, что если ввести повторяющиеся числа, то программа их игнорирует. Т.е. если ввести, допустим, 1, 2 и 2, то по идее должны получить 122, 212 и 221, кол-во перестановок, таким образом, равняется 3, а у меня программа видит только 1 и 2, соответственно расчеты происходят неверно.
Самое главное - программа должна быть РЕКУРСИВНОЙ!
Код прилагаю ниже, надеюсь на ваши доработки.
И да, совсем забыл, работаю в Pascal ABC.
Код:
uses
  crt;

const
  maxn = 30;

type
  
  mass = array [1..maxn] of integer;

var
  a, b: mass;
  n, k: integer;
  kol: longint;

procedure input(var n: integer; var a: mass);
var
  buf: string;
  i, err: integer;

begin
  
  Write('Введите количество чисел от 2 до 30: ');
  
  repeat
    Readln(buf);
    val(buf, n, err);
    if (err <> 0) or (n < 2) or (n > 30) then writeln('Некорректные данные, повторите ввод');
  until (err = 0) and (n >= 2) and (n <= 30);
  
  for i := 1 to n do 
  begin
    Write('Введите ', i, ' число: ');
    repeat
      Readln(buf);
      val(buf, a[i], err);
      if (err <> 0) then writeln('Некорректные данные, повторите ввод');
    until (err = 0);
  end;
end;

procedure treatment(var k: integer; var a, b: mass);

var
  i, j, m: integer;

begin
  k := 0;
  for i := 1 to n do 
  begin
    m := 0;
    for j := 1 to n do
      if (a[i] = b[j]) then
        inc(m);
    if m = 0 then begin
      inc(k);
      b[k] := a[i];
    end;
  end;
end;

procedure generate(l, k: integer; var kol: integer; var a, b: mass);
var
  i, buff: integer;
begin
  if (l = k) then
  begin
    for i := 1 to k do write(b[i], ' ');
    writeln;
    kol := kol + 1;
  end
  else
  begin
    for i := l to k do
    begin
      buff := b[l]; b[l] := b[i]; b[i] := buff; {обмен b[i],b[l]}
      generate(l + 1, k, kol, a, b); {вызов новой генерации}
      buff := b[l]; b[l] := b[i]; b[i] := buff; {обмен b[i],b[l]}
    end;
  end;
end;

begin
  clrscr;
  input(n, a);
  treatment(k, a, b);
  generate(1, k, kol, a, b);
  writeln;
  writeln('Количество перестановок = ', kol);
  readln
end.

Последний раз редактировалось Stilet; 14.04.2015 в 07:30.
anton_guitar вне форума Ответить с цитированием
Старый 13.04.2015, 21:24   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Т.е. если ввести, допустим, 1, 2 и 2, то по идее должны получить 122, 212 и 221
Не будет такого (при таком варианте)

Есть два вариант генерирования всех перестановок :
1) Рекурсивный вариант
2) Крутить next_permutation
Рекурсивный вариант :
1) даст Вам перестановки в произвольном порядке
2) кол-во перестановок при любом раскладе будет равно N! (где N длина исходной последовательности)

Ессесно это можно исправить :
запоминать перестановки (а потом отсортировать (сложность только возрастет)) или сделать такую классную вещь (тут разговоры про сложность лишены смысла) : тыц (именно это и есть решение твоей задачи!)
Poma][a вне форума Ответить с цитированием
Старый 13.04.2015, 21:41   #3
anton_guitar
 
Регистрация: 06.01.2015
Сообщений: 8
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление, умножение, суммирование, хэлпа нужна очень... почти готов код OldStile Помощь студентам 2 20.03.2015 17:52
Небольшая доработка сайта, платно aborsp Фриланс 0 01.03.2013 18:07
небольшая доработка siner Паскаль, Turbo Pascal, PascalABC.NET 2 05.11.2012 16:06
Доработка парсера. Готов на 80% gemiroquai Фриланс 0 02.04.2012 11:12
Нужно исправить код. Он готов, но нужна проверка и доработка. Forbesii Фриланс 2 24.12.2010 23:09