1
Metoda relurii
Datele iniiale n metoda relurii
Mulimile:
A1 {a11 , a12, , a1m1 };
A2 {a21 , a22, , a2 m2 };
...
An {an1 , an 2, , anmn }.
Soluia n metoda relurii
Spaiul soluiilor:
S A1 A2 An
Soluia:
X ( x1 , x2 , , xn ),
unde
x1 A1 ; x2 A2 ; ..., xn An .
Ideia metodei relurii
1. Presupunem c la pasul k am calculat deja valorile:
( x1 , x2 , , xk )
2. Selectm din mulimea Ak+1 valoarea xk+1:
( x1 , x2 , , xk , xk 1 )
3. Dac ( x1 ,
x2 , , xk , xk 1 ) satisface condiiile
problemei, trecem la pasul k+2.
n caz contrar revenim la pasul k i alegem alt xk.
Cutarea soluiei prin metoda relurii 5
k := 1
1 ,1
1 ,2
2 ,2
k := k + 1
a
2 ,1
1
k := k + 1
k := k -1
k := k + 1
a
0
3 ,1
a 3 ,2
0
0
a 3 ,3
Schema general a algoritmului recursiv
6
bazat pe metoda relurii
procedure Reluare(k:integer);
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}
Operaii
Procedura Reluare comunic cu programul apelant i subprogramele
apelante prin variabilile globale ce reprezin vectorul X i
mulimile A1, A2, ..., An.
Subprogramele apelante execut urmtoarele operaii:
PrimulElement (k)- returneaz primul element din mulimile Ak ;
Continuare (k)- returneaz valoarea true dac elementele nscrise n primele k componente
ale vectorului X satisfac condiiile de continuare i false n caz contrar;
ExistaSuccesor (k)- returneaz valoarea true dac elementul memorat n componena xk
are un succesor n mulimea Ak i false n caz contrar.
Succesor (k)- returneaz succesorul elementului memorat n componena x
PrelucrareaSolutiei- de obicei, n aceast procedur soluia reinut n vecto
afiat la ecran.
Clasificarea problemelor
1. Mulimile A1, A2, ..., An snt cunoscute.
2. Snt cunoscute elementele din care snt formate
mulimile A1, A2, ..., An, numrul n fiind
necunoscut.
3. Elementele din care snt formate mulimile A1,
A2, ..., An i numrul n snt necunoscute.
Exemplul 1. Problema din manual
Se consider mulimile A1, A2, ..., An, fiecare mulime
fiind format din mk numere naturale. Selectai din
fiecare mulime cte un numr n aa mod nct suma lor
s fie egal cu q.
Exemplul 1. Reprezentarea datelor
10
const mmax=50; { numrul maximal de mulimi }
nmax=50; { numrul maximal de elemente }
type Natural = 0..MaxInt;
Multime = array[1..nmax] of Natural;
var
A : array[1..nmax] of Multime;
n : 1..nmax;
{ numrul de mulimi }
M : array[1..nmax] of 1..mmax; { cardinalul mulimii S[k] }
X : array[1..nmax] of 1..mmax; { indicii elementelor selectate }
q : Natural;
k, j : integer;
Indicator : boolean;
Function PrimulElement
11
function PrimulElement(k : integer) : Natural;
begin
PrimulElement:=1;
end; {PrimulElement }
Function Continuare
12
function Continuare(k : integer) : boolean;
var j : integer;
suma : Natural;
begin
suma:=0;
for j:=1 to k do suma:=suma+A[j, X[j]];
if ((k<n) and (suma<q)) or ((k=n) and (suma=q))
then Continuare:=true
else Continuare:=false;
end; { Continuare }
Function ExistaSuccesor
function ExistaSuccesor(k : integer) : boolean;
begin
ExistaSuccesor:=(X[k]<M[k]);
end; { ExistaSuccesor }
function Succesor (k:integer) : integer;
begin
Succesor :=X[k]+1;
end;{Succesor}
procedure PrelucrareaSolutiei;
var k: integer;
begin
write (Solutia:);
for k:=1 to n do write (A[k, X[k]],);
writeln;
Indicator:=true;
end; {PrelucrareaSolutiei}
13
Procedure Reluare
14
procedure Reluare(k : integer);
{ Metoda reluarii - varianta recursiva }
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 }
Exemplul 2. Labirintul
1
1
2
3
2 3 ...
... m
i
C
n
15
Labirintul. Formularea matematic 16
Mulimile:
A1 {Sus, Dreapta , Jos, Stnga}
A2 {Sus, Dreapta , Jos, Stnga}
A3 {Sus, Dreapta , Jos, Stnga}
...
Soluia:
X {Dreapta , Dreapta , Dreapta , Jos, Dreapta ,
Dreapta , Dreapta , Jos, Jos, Jos, Jos}