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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2008, 20:57   #1
p@ul
Новичок
Джуниор
 
Регистрация: 15.05.2008
Сообщений: 2
Смущение Рекурсия.

Здравствуйте. Недавно стал изучать программирвоание, и дошёл до изучения рекурсии. Сразу же возникла проблема в задаче. Чё-то никак не вдуплю. Ребят, покажите как работать с рекурсией. А задача такая:
Дана последовательность чисел от 1 до n. Написать рекурсивную функции (или процедуру), которая генерирует всевозможное количество перестановок чисел от 1 до n. Помогите кто может. Хочу посмотреть как это вообще делается, ну в смысле работа с рекурсией на примере данной задачи, ну а потом разберусь. Чё-то в тупик меня эта рекурсия завела.

Последний раз редактировалось p@ul; 15.05.2008 в 21:52.
p@ul вне форума Ответить с цитированием
Старый 15.05.2008, 21:27   #2
Tayfun
Форумчанин
 
Аватар для Tayfun
 
Регистрация: 24.06.2007
Сообщений: 351
По умолчанию

Код:
program perestanovki;
uses crt;
const n=5;
var
main,posl:array[1..n] of integer;
incl:array[1..n] of boolean;
kolvo,i:integer;
procedure perest(p:integer);
var c:integer;
begin
if p=n+1 then begin
for i:=1 to n do write(posl[i],' ');
write('      ');
kolvo:=kolvo+1;
end;
for c:=1 to n do begin
if not incl[c] then begin
posl[p]:=main[c];
incl[c]:=true;
perest(p+1);
posl[p]:=0;
incl[c]:=false;
end;
end;
end;
begin
clrscr;
for i:=1 to n do main[i]:=i;
perest(1);
writeln;
writeln(kolvo);
readkey;
end.
Что-то примерно так будет...
Я не маюсь бездельем, я от него тащусь!
Tayfun вне форума Ответить с цитированием
Старый 15.05.2008, 21:51   #3
p@ul
Новичок
Джуниор
 
Регистрация: 15.05.2008
Сообщений: 2
По умолчанию

Спасиб))) Ща попробуем))
p@ul вне форума Ответить с цитированием
Старый 30.12.2009, 12:42   #4
lnker
Новичок
Джуниор
 
Регистрация: 27.11.2009
Сообщений: 1
По умолчанию

Цитата:
Сообщение от Tayfun Посмотреть сообщение
Код:
program perestanovki;
uses crt;
const n=5;
var
main,posl:array[1..n] of integer;
incl:array[1..n] of boolean;
kolvo,i:integer;
procedure perest(p:integer);
var c:integer;
begin
if p=n+1 then begin
for i:=1 to n do write(posl[i],' ');
write('      ');
kolvo:=kolvo+1;
end;
for c:=1 to n do begin
if not incl[c] then begin
posl[p]:=main[c];
incl[c]:=true;
perest(p+1);
posl[p]:=0;
incl[c]:=false;
end;
end;
end;
begin
clrscr;
for i:=1 to n do main[i]:=i;
perest(1);
writeln;
writeln(kolvo);
readkey;
end.
Что-то примерно так будет...
Искал алгоритм даный давно.. очень давно...
Спасибо огромное, но как сделать чтобы:
1) Значение n считывало с фала swap.cfg, и при этом значение n может быть больше 10..
2) записывало перестановки в файл out.lst, и разделяло элементы перестановок символом "."
3) перезаписывалоswap.cfg так чтобы в первою строку внеслось n!, а во вторую строку (во время записи out.lst) пследовательный номер перебора (какая по-щету перестановка в даный момент обработалась );


(как известно количество перестановок равно n!)

function fact(n: integer): longint;
begin
if n <= 1 then
fact := 1
else
fact := n * fact(n - 1)
end;




Заранее спасибо

Последний раз редактировалось lnker; 30.12.2009 в 12:53.
lnker вне форума Ответить с цитированием
Старый 30.12.2009, 14:46   #5
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

Код:
program RP;

const
  Source = 'swap.cfg';
  Target = 'out.lst';
  Len = 20;

type
  TArray = Array[1..Len] of Byte;

var
  S: TArray;
  F: Text;
  C: Integer;

procedure Print(const N: Integer; const X: TArray);
var
  I: Integer;
begin
  Write(F, C, ' ');
  for I := 1 to N do
    if I <> N then Write(X[I], '.') else Write(X[I]);
  WriteLn;
end;

procedure RecursivePermutations(const N, K: Integer; X: TArray);
var
  I: Integer;
begin
  if K = N then
  begin
    Inc(C);
    Print(N, X);
    Exit;
  end;
  for I := 1 to N do
  begin
    if S[I] = 0 then
    begin
      S[I] := 1;
      X[K + 1] := I;
      RecursivePermutations(N, K + 1, X);
      S[I] := 0;
    end;
  end;
end;

procedure Permutations(const N: Integer);
var
  X: TArray;
  I: Integer;
begin
  for I := 1 to N do
    S[I] := 0;
  RecursivePermutations(N, 0, X);
end;

function Factorial(const N: Integer): Integer;
begin
  if (N = 0) or (N = 1) then
  begin
    Factorial := 1;
    Exit;
  end;
  Factorial := N * Factorial(N - 1);
end;

var
  N: Integer;
begin
  Assign(F, Source);
  Reset(F);
  ReadLn(F, N);
  Close(F);
  Assign(F, Source);
  Rewrite(F);
  WriteLn(F, Factorial(N));
  Assign(Output, Target);
  Rewrite(Output);
  C := 0;
  Permutations(N);
  Close(F);
end.

Последний раз редактировалось Alex_FF; 30.12.2009 в 14:49.
Alex_FF вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия vitekbest Помощь студентам 1 30.05.2008 22:22
рекурсия Vital_k Паскаль, Turbo Pascal, PascalABC.NET 1 08.02.2008 13:09
Рекурсия АнНютик Паскаль, Turbo Pascal, PascalABC.NET 1 29.01.2008 22:50
Рекурсия Pravednik Помощь студентам 3 21.01.2008 14:18
Рекурсия Xeon332 Помощь студентам 5 16.01.2008 20:52