2. În metoda reluării se presupune că soluția problemei
pe care trebuie să o rezolvăm poate fi reprezentată
printr-un vector: X=(x1, x2,.., xk,…, xn). Fiecare
componentă xk a vectorului X poate lua valori dintr-o
anumită mulțime Ak, k=1,2,..., n. Se consideră că cele mk
elemente ale fiecărei mulțimi Ak sînt ordonate conform
unui criteriu bine stabilit.
Cînd voaloarea pentru xk este stabilită, se verifică
anumite condiții de continuare referitoare la
x1, x2,..., xk.
3. Menționăm faptul că anume micșorarea lui k dă
nume metodei studiate, cuvintul “reluare” semnificînd
revenirea la alte variante de alegere a variabilelor
x1, x2,..., xk-1. Evident, aceeași semnificație o are și
denumirea engleză a metodei în studiu-backtracking
(back-înapoi, track-urmă).
4. begin
if k<=n then
begin
X[k]:=PrimulElement(k);
if Continuare(k) then Reluare(k+1);
while ExistaSuccesor(k) do
begin
X[k]:=Succesor(k);
if Continuare(k) then Reluare(k+1)
end; { while }
end { then }
else PrelucrareaSolutiei;
end; {Reluare}
5. Fie n aparține N*. Scrieți un program recursiv care să genereze toate
partițiile mulțimii {1,2.....n}.
program Partitii;
const NMax = 20;
type Element = 1..NMax;
Clasa = 1..NMax; Partitie = array[Element] of Clasa;
var N: Element; {numarul de elemente din multime}
NC: Clasa; {numarul de clase}
P: Partitie; NrP: word; {numarul de partitii}
procedure Afisare;
var i: Element; j: Clasa;
begin inc(NrP); write('Partitia ', NrP, ': ');
for j := 1 to NC do begin {afisez clasa nr. j} write(' {');
for i := 1 to N do
if P[i]=j then write(i, ' ');
write(#8'} ');
end; writeln; end;
6. procedure GenPartitie(k: Element);
{cand apelam GenPartitie(k), in vectorul P pe primele k-1 pozitii se
afla o partitie a multimii 1,2,...,k-l formata din NC clase}
var j: Clasa;
begin
if k=N+1 then Afisare {partitia este complet construita}
else begin {plasam elementul k in una din clasele
existente}
for j := 1 to NC do begin P[k] := j; GenPartitie(k + 1); end;
{sau elementul k reprezinta o clasa separata}
inc(NC) ;{maresc numarul de clase}
P[k] := NC;
GenPartitie(k+1); dec(NC); {restaurez numarul de clase} end;
end;
begin {program principal}
write('n= '); readln(n); GenPartitie(1);
end.