III. Paradigma backtracking 1. Prezentarea generală a metodei Implementarea iterativă/recursivă
2.Studii de caz simple: probleme de combinatorică
3. Studii de caz complexe:
4. Extinderi ale metodei backtracking (spaţiul soluţiilor este bidimensional)
5. Studii de caz avansate
1. Generarea permut ărilor de n elemente 2. Generarea aranjamentelor de n elemente luate cite k 3. Generarea combin ărilor de n elemente luate cite k 4. Generarea parti ţ iilor iilor unui intreg n 5. Generarea parti ţ iilor iilor unei mul ţ imi imi 1. Problema celor n regine 2. Colorarea grafurilor (h ăr ţ ilor) ilor) 3. Submul ţ imi imi de sumă dat ă 4. Problema comis- voiajorului 1. Problema labirintului 2. Problema calului pe tabla de sah 3. Problema zarului 4. Problema fotografiei
1. Diferen ţ a dintre vecini(bac. iulie 1999) 2. Numere supermultimple(bac.aug. 1999) 3. Numere cu suma cifrelor constant ă (bac iulie 2000) 4. Litere distincte(bac.aug. 2000) 5. Submul ţ imi imi ordonate de sumă dat ă (bac iulie 2001) 6. Generare şiruri (bac august 2001) 7. Problema admitere Info-2001 8. Generarea perechilor de paranteze 9. Problema caselor de bani 10. Problema preferin ţ elor elor 11. Problema depozit ării calculatoarelor
6. Aplicaţii propuse
(pe grade de dificultate)
12
III.1. Prezentarea general ă a metodei Backtracking este o metod ă care îmbunăt ăţ ăţ eşte că utarea exhaustivă. Un algoritm de căutare exhaustivă este definit după următoarea schemă: se defineşte spaţ iul iul soluţ iilor iilor potenţ iale iale U şi cu un algoritm de enumerare se selectează acele soluţ iiii potenţ iale iale care sînt soluţ iiii ale problemei. O solu ţ ie ie poten ţ ial ial ă este soluţ ie ie dacă satisface o condiţ ie ie ST ce poate fi testat ă în timp polinomial. Paradigma backtracking înlocuieşte că utarea exhaustivă cu una parţ ial ială, bazat ă pe ideea “încearcă ceva şi dacă nu merge atunci mai încearcă altceva”. Presupunem că spaţ iul iul soluţ iilor iilor potenţ iale iale poate fi reprezentat printr-un arbore. Atunci, fiecare solu ţ ie ie potenţ ial ială este descrisă de un drum de la răd ădcină la un vîrf pe frontier ă.
1. Enumerarea elementelor produsului cartezian {1,...,m}n
Modelul matematic intrarea: m, n din N ieşire: toate elementele produsului cartezian {1,...,m}x{1,...,m}x...x{1,...,m} de n ori
=j; =j; reprezentarea solutie : s i iul solu ţ iilor iilor criteriul candidat: nu este necesar, pentru ca spa ţ iul
poten ţ iale iale coincide cu spa ţ iul iul solu ţ iei iei rezultat
n
Enumerarea elementelor produsului cartezian {1,...,m} procedure EnumProdCart(m,n) begin i 1; x[1] 0 while (i > 0) do if (x[i] < m) then x[i]++ if (i=n) then Scrie(x) else i++ x[i] 0
else k--
13
end
1
1
(1,1)
2
(1,2)
3
2
1
(2,1)
2
(2,2)
1
(3,1)
2
(3,2)
Fig. 1: Arborele reprezent reprezent ării pentru exemplul: {1,2,3} {1,2}
14
III.2. De la DFS la backtracking: studii de caz simple 1 Pe parcursul capitolului pentru fiecare studiu de caz se va analiza problema urmărind reprezentarea soluţ iei cu arbori, spaţ iul soluţ iilor posibile, aplicarea funcţ iei de t ăiere. Corespunzător celor două variante ale programului DFS, avem două descrieri pentru algoritmul backtracking: una nerecursiv ă şi una recursivă. Soluţ ia se poate reprezenta printr-un element (x1,..xm) aparţ inînd produsului cartezian S1xS2x..xSm. Dacă Si= 1,2,..,n i schiţ a metodei este prezentat ă în ambele variante: iterativ şi recursiv. a) Varianta nerecursivă se obţ ine prin adaptarea programului iterativ corespunzător parcurgerii DFS a unui graf. Backtracking: algoritm iterativ procedure Backtracking() begin i 1; x[i] 0 repeat while ( x[i] < nr )i do begin x[iî++ if (Candidat(x,i)) then if (i=n and ST(x)) then Scrie(x) else begin i ++;x[i] 0 end
end i- until i=0; end
Deoarece simulează numai parcurgerea arborelui, stiva este reprezentat ă de o variabilă simplă i ce înregistrează nivelul în arbore a vîrfului vizitat. b) Varianta recursivă se obţ ine prin modificarea programului recursiv specific parcurgerii DFS a grafurilor.
1
In Anexa sint prezentate implement[rile Pascal/C ]nso`ite de comentarii \i parte grafic[ (acolo unde este necesar) pentru algoritmii aborda`i 15
Backtracking: algoritm recursiv procedure BacktrackRec(i); begin for j=1 to nr i do begin xi j if Candidat (x,i) then if i
În programul principal apelul va fi: begin
BacktrackRec(1); End;
Varianta nerecursivă este mai rapid ă decît varianta recursivă, datorit ă eliminării apelurilor recursive dar diferenţ a de timp dintre cele două variante nu este foarte mare. Fiecare din schemele de mai sus va fi modelat ă peste algoritmul de enumerare utilizat pentru generarea soluţ iilor potenţ iale. Dacă soluţ iile potenţ iale sînt elemente ale unui produs cartezian A1x..xAn, atunci “for fiecare valoare posibilă pentru x[iî ” se traduce prin “for fiecare xiAi”, iar condiţ ia “xi pe frontieră“ este echivalent ă cu “i=n”. Paradigma “backtracking” propune o enumerare par ţ ială a soluţ iilor potenţ iale prin introducerea unei funcţii de tăiere (criteriu candidat): (x1, ..., x i) candidează la soluţ ie dacă avem şanse să găsim (xi+1, ..., x n) a.i. (x 1, ..., xn) să fie soluţ ie
• •
dacă (x1, ..., x i) candidează i i+1 (forward)
dacă (x1, ..., x i) NU candidează i i-1 (backward) Astfel, rezult ă cele două elemente ce caracterizează un algoritm backtracking: reprezentarea solu ţ iilor şi criteriul de mărginire.
16
Generarea elementelor combinatorice Analiza combinatorică este o ramură a matematicii care studiază diferite posibilit ăţ i de ordonare sau de combinare a unor elemente. În practică, adesea, se ajunge la problema de a alege dintr-o mul ţ ime oarecare de obiecte submulţ imi de elemente care posed ă anumite propriet ăţ i, de a dispune de elementele uneia sau ale mai multor mul ţ imi într-o anumit ă ordine. Aceast ă ramură are mare importanţă pentru teoria probabilit ăţ ilor, cibernetică, logica matematică, teoria numerelor precum şi pentru alte ramuri ale ştiinţ ei şi tehnicii. În continuare vor fi prezenta ţ i algoritmii de generare a acestor elemente combinatorice.
1. Generarea permut ărilor a n elemente Enun ţ : Genera ţ i toate permut ă rile elementelor 1,2,..,n.
Schema problemei:
Problema intrare: mul ţ imea 1,2,..,n ieşire: toate posibilit ăţ ile de aranjare a clor n elemente ale mulţ imii date;
Solu ţ ie:
Definite riguros, permutările de ordin n sînt funcţ ii bijective de forma: s:1,2,..,n 1,2,..,n . Reprezentarea se face prin vectorul s, cu n componente, avînd semnificaţ ia: si este elementul asociat prin intermediul funcţ iei s elementului i.
Aplicarea paradigmei: reprezentarea solutiei: vectorul s cu n componente criteriul candidat ( i): 1 i k-1 s[i] s[k];
17
1
3
1
2
1
2
3
1
(1,2,3)
Fig. 2.
2
3
(1,3,2)
3
2
1
1
2
3 (2,1,3)
2
3
1
1
2
3
(2,3,1)
1
2
3
(3,1,2)
3
2
1
2
3
(3,2,1)
Problema generr ării permut ărilor (n=3) : arborele reprezent ării
2. Generarea aranjamentelor O educatoare pregăteşte serbarea de Cr ăciun. Pe scena gr ădini ţ ei se poate amplasa un rînd de m scaune, dar grupa educatoarei are n copii (m<=n). Afişa ţ i toate variantele pe care le are educatoarea la dispozi ţ ie de a aranja copiii pe cele n scaune.
Enun ţ :
Schema problemei:
Problema intrare: mulţ imea 1,2,..,n , m<=n ieşire: toate submulţ imile ordonate de m elemente ale unei mulţ imi cu n elemente
Solu ţ ie:
Problema poate fi tratat ă numeric (numerotînd copii de la 1 la n) sau reţ inînd numele copiilor (dar care se reduce apoi tot la cazul numeric prin prelucrarea numărului de ordine al copiilor). Definite riguros, aranjamentele de n elemente luate cîte m sînt funcţ ii injective definite astfel: s:1,2,..,n 1,2,..,m .
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul s cu m componente criteriul candidat ( i) 1 i k-1 s[i] s[k]
18
Se observă din modul de reprezentare a informa ţ iilor şi din formularea condiţ iilor interne, că singura diferenţă între generarea permut ărilor şi generarea aranjamentelor const ă în dimensiunea vectorului soluţ ie.
1
1
2
1
3
(1,2) (1,3)
3
2
(2,1)
2
3
(2,3)
1
3 2
(3,1) (3,2)
Fig. 3. Problema gener ării aranjamentelor: arborele reprezent ării (n=3, m=2)
3. Generarea combin ărilor Enun ţ : Genera ţ i toate submul ţ imile de m elemente ale mul ţ imii 1,2,..,n .
Schema problemei:
Problema intrare: mulţ imea 1,2,..,n , m<=n ieşire: toate submulţ imile de m elemente ale unei mulţ imi cu n elemente.
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul s cu cele m componente ordonate crescător
criteriul candidat ( i) 1 i k-1 s[i]
19
1
1
2
3
(1,2) (1,3)
3
2
1
2
3
1
3 2
(2,3)
Fig. 4. Arborele gener ării combinărilorlor n=3, m=2
4. Generarea parti ţiilor unui întreg Enun ţ : Genera ţ i toate parti ţ iile numă rului n, nN.
Defini ţ ie. Fie nN. Numim parti ţ ie a unui număr antural nenul n un sistem de numere naturale nenule (p 1,..,pi) astfel ca p1+p2+...pk =n. Schema problemei:
Problema intrare: nN. ieşire: (p1,..,pi) astfel încît p1+p2+..+pi=n; Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul p cu maxim n componente în
care se reţ in elementele partiţ iei; pentru a nu genera de două ori aceeaşi partiţ ie (de exemplu 5=1+4, 5=4+1), elementele partiţ iei vor fi memorate în ordine crescătoare;
criteriul candidat: 1. p i 1,2,..,n , i 1,2,..,n 2. p[i]
20
3
1 2
3 1
(3)
2
(1,2)
1 (1,1,1)
Fig. 5. Arborele t ăiat pentru reprezentarea parti ţ iilor n=3
Se observă că fiecare element p i va avea valorile cuprinse între p i-1 şi diferenţ a dintre n şi suma primelor i-1 valori din parti ţ ie. Pentru ca generarea să se realizeze mai rapid, se va utiliza un şir ajut ător (s), cu si p j . i
j 1
Exemplu: pentru n=3, se ob ţ ine: 3=1+1+1 3=1+2 3=3 Observa ţ ie: O aplicaţ ie interesant ă a generării partiţ iilor unui întreg este simularea fisiunii nucleare. Cînd un atom format din protonii şi neutronii nucleului este divizat, este spart înr-o mul ţ ime de particule mai mici. Suma particulelor în mulţ ime trebuie să fie egală cu mărimea originală a nucleului. Astfel, partiţ iile unui întreg reprezint ă toate căile posibile de a diviza un atom.
5. Generarea parti ţiilor unei mul ţimi Enun ţ :
Genera ţ i toate parti ţ iile mul ţ imii M=1, 2, ..,n .
Fie M o mul ţ ime nevid ă. S= S1,S2,..,Sk constituie o partiţ ie a mulţ imii M dacă şi numai dacă sînt îndeplinite următoarele condiţ ii: (clasele partiţ iei sînt nevide) 1. Si, i1,2,..,k 2. SiS j=, i j, i,j1,2,..,k (clasele partiţ iei sînt disjuncte) (reuniunea claselor este M) 3. S1S2..Sk =M
ţ ie: Defini
21
Schema problemei:
Problema intrare: mulţ imea 1,2,..,n , n din N; ieşire: toate partiţ iile acestei mulţ imi; Solu ţ ie:
Aplicarea paradigmei: reprezentarea solutiei: vectorul s cu n componente, în care
pentru fiecare element din mul ţ imea 1,2,..,n reţ in indicele clasei din care face parte, aceast ă reprezentare asigurînd respectarea tuturor condiţ iilor din definiţ ia partiţ iei;
criteriul candidat ( i) 1 i k-1 s[i]
1
1
2
3
(1,2) (1,3)
3
2
1
2
3
1
3 2
(2,3)
Fig. 6. Arborele t ăiat pentru reprezentarea parti ţ iilor unei mul ţ imi cu 3 elemente
pentru n=3 programul va afi şa: Parti ţ ia 1: 1 2 3 Parti ţ ia 2: 1 2 3 Parti ţ ia 3: 1 3 2 2 3 Parti ţ ia 4 : 1 2 3 Parti ţ ia 5: 1
Exemplu:
22
III.3. Studii de caz complexe 1. Problema celor n regine Enun ţ : Determina ţ i
toate modurile în care pot fi aranjate n regine pe tabla de şah astfel încît să nu se atace. Schema problemei:
Problema intrare: n N; ieşire: toate aşezările posibile ale celor n regine pe tabla de şah n n f ără ca acestea să se atace;
1 1
2
3
4
R R
2 3 R 4
R
Fig. 7: Dispunerea reginelor pe o tabl ă de şah 4 4
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei:
Q: 1,..,n x 1,..,n false, true
•
o reprezentare care nu-i OK Q[i,j] = true pe pozitia [i,j] se gaseste o regina nr. sol. potentiale = 2n n
•
o reprezentare mai buna s[i] = j Q[i,j] = true
nr. sol. potentiale = nn
criteriul candidat : (i) 1ik-1 s[i] s[k] |s[i]-s[k]| |i-k| 23
1
2 4
4
3 1
1
4 3
2
Fig. 8. Problema celor n (n=4) regine: arborele taiat
Considerînd o tabla nxn, scopul este s ă plasăm cele n regine astfel încît să nu fie două regine pe aceeaşi linie, coloană sau diagonală. Problema este una a satisfacerii condiţ iilor. Cînd n este 8 astfel încît s ă fie utilizat ă o tablă de şah uzuală problema este cunoscut ă ca "problema celor 8 regine". Analiza
Cele mai multe probleme de satisfacere a condiţ iei aparţ in clasei NP2 pentru care nu sînt cunoscute metode de rezolvare eficient ă. Problema celor n-regine este o problem ă NP şi a fost utilizat ă ca un exemplu în cercetarea AI sau # Solutii unice programare. Găsirea unei soluţ ii în n # Solutii 4 1 problema celor n regine pentru orice n 5 2 2 1 mai mare sau egal cu 4 poate fi f ăcut ă 6 10 4 7 6 f ără că utare. 40 8 12 Not ăm că pentru n oarecare nu 9 92 46 352 92 toate soluţ iile sînt unice astfel încît multe 10 724 11 341 din ele sînt reflectate (în jurul unor axe) 12 2,680 1,787 sau rotite de la altele, acestea fiind 13 14,200 9,233 73,712 14 45,752 ilustrate în tabel. 365,596 Tabel 1: Determinarea numarului de pentru n regine (n>3)
15 16 17 solu ţ ii 18 19 20
2,279,184 14,772,512 95,815,104 666,090,624 4,968,057,848 39,029,188,884
285,053 1,846,955 11,977,939 83,263,591
2
Practic, problemele din clasa NP pot fi rezolvate într-un timp având valoarea cuprinsã între timpul polinomial \i timpul exponenþial. Clasa este numitã NP ca urmare a faptului cã un algoritm nedeterminist (de ghicire) poate sã reducã dificultatea problemelor de la complexitatea exponenþialã la complexitatea polinomialã. Cele mai grele probleme din clasa NP sunt denumite NP-complete.
24
2. Colorarea grafurilor (hărţilor) Se dau numerele naturale n, m (n,m N ). S ă se afişeze toate modalit ăţ ile de a colora o hart ă care cuprinde n regiuni, cu cele m culori, în aşa fel încît regiunile învecinate să fie colorate cu culori diferite.
Enun ţ :
Schema problemei:
Problema intrare: un (di)graf G=(V,E) cu V=1,..,n şi m culori numerotate de la 1 la m.
ieşire: toate colorările posibile ale muchiilor astfel ca oricare muchie să aibă extremit ăţ ile colorate diferit.
2 3
4
1
5
1
4
3 5
Fig9. Rela ţ ia de vecinătate într-o hart ă reprezentat ă printr-un graf (n=5, m=3)
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul s; Spa ţ iul solu ţ iilor potentiale = 1,..,m n şi poate fi reprezentat printr-un arbore cu n nivele în care fiecare nod interior are exact m succesori.
criteriul candidat : (i) 1ik-1 i,k E si sk . Observa ţ ie: După mai bine de o sut ă de ani (problema a fost formulat ă pentru prima dat ă în 1852 de către un student londonez, Francis Guthrie), în 1976 s-a putut demonstra (Appel şi Haken) că patru culori sînt 25
suficiente pentru colorarea unei hărţ i, expunerea acestui rezultat incluzînd verificarea unei propriet ăţ i de reductibilitate a grafurilor cu ajutorul calculatorului.
1
3 2
1 3
2
... 1 2
1 3
...
...
2
1
3
3
1
2
... 3
2
1
...
3 2
Fig. 10. Reprezentarea spa ţ iului solu ţ iilor poten ţ iale
1
3
2
1
1
2
3
2
1
3
2
3
1
2
1
2 3
2
3
1
3
1
1
2
3
1
2
Fig 11. Arborele par ţ ial ob ţ inut după aplicarea func ţ iei de t ăiere (n=5, m=3)
26
3. Submulţimi de sumă dată Fie M o mul ţ ime de numere naturale strict pozitive şi S un număr natural din N . S ă se afişeze toate submul ţ imile mul ţ imii M cu proprietatea că suma valorilor elementelor submul ţ imii este egal ă cu S. Enun ţ :
Schema problemei:
Problema +. intrare: o mul ţ ime A= 1,..,n şi s(i)=wi, şi M Z ieşire: A’A, cu proprietatea s(a) M . a A'
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solutiie: prin vectori de lungime n, (x 1,..xn ) cu xi 0,1 avînd semnifica ţ ia xi=1 wi solu ţ iei (vectorii caracteristici).
Spa ţ iul solu ţ iilor poten ţ iale = 2n şi poate fi reprezentat printrun arbore binar
criteriul candidat: x w k
i
i
M şi
i 1
k
n
xi wi
i 1
w
i
M
i k 1
De remarcat că acest criteriu nu elimină toţ i subarborii care care nu conţ in vîrfuri soluţ ie, dar elimină foarte mulţ i, restrîngînd astfel spaţ iul de că utare. 0
1
1
0 1
0
1
1
1
0 1
1
1
ţ imi de sumă dat ă : arborele t ă iat Fig. 12. Submul
27
4. Problema comis- voiajorului Enun ţ :
Un voiajor comercial trebuie să-şi vînd ă produsele în n oraşe, revenind apoi în oraşul unde locuieşte. S ă se afişeze toate traseele (dacă exist ă ) pe care acesta le poate urma dacă se cunosc perechile de oraşe între care exist ă deplasare direct ă. Oraşele se identifică prin valorile 1,2,..,n. Fiecare ora ş, cu excep ţ ia celui de plecare, este parcurs o singur ă dat ă. S ă se trateze cazurile:
2
1
3
4
a) comis-voiajorul locuieşte în oraşul 1; b) comis-voiajorul locuieşte în oraşul i; Fig. 13. Rela ţ ia
de vecinătate între cele 4 oraşe ale traseului reprezentat ă printr-un
graf
Schema problemei:
Problema intrare: n din N (nr. de oraşe) şi ai,jR+ (costurile deplasării);
ieşire: toate traseele posibile pentru comis voiajor astfel încît s ă viziteze toate cele n oraşe f ără a trece de două ori prin acelaşi oraş iar în final să revină în oraş ul din care a plecat;
Solu ţ ie:
Aplicarea paradigmei:
28
reprezentarea solu ţ iei: traseele posibile le generăm în vectorul
p. Componentele lui p sînt ora şe, deci numere din mulţ imea 1,2,..,n ; p1=1;
criteriul candidat:
pipk , i1,2,..,k-1 apk-1,pk =1 pentru k=n se verifică posibilitatea întorcerii, adică apn,1=1 4
1
2
3 3
3
1
4
3
2
4
4
2
4
1
1
3
1
4
2
2
2
3
4
(1,2,3,4,1)
3
2 2
1
1
1
(1,4,3,2,1)
2
(2,1, 4,3, 2)
2
(2,1,4,3,2)
3
(3,2,1,4,3)
3
(3,4,1,2,3)
1
4
(4,1, 2,3, 4)
4 (4,3, 2,1, 4)
Fig. 14. Problema comis voiajorului-arborele t ăiat n=4
29
III.5. Studii de caz avansate 1. Diferenţa dintre vecini
se citeşte de la tastatur ă un număr natural n (n<21) şi un număr natural v. Scrie ţ i un program comentat, folosind metoda backtracking, care afişează toate numerele de la 1 la n în toate modurile posibile, astfel încît între oricare două numere afişate în pozi ţ ii vecine, diferen ţ a în modul să fie mai mare decît valoarea dat ă v. Datele de ieşire se vor scrie în fişierul ieşire.dat. În cazul în care nu exist ă solu ţ ie în fişierul de ieşire se va scrie 'Nu exist ă solu ţ ie'. (Bacalaureat, iunie 1999) Schema problemei:
Enun ţ :
Problema intrare: n şi v din N; ieşire: numerele de la 1 la n în toate modurile posibile pentru
care diferenţ a în modul a elementelor din pozi ţ ii vecine să fie mai mare decît valoarea dat ă v;
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul s cu n elemente în care sisi+1>v;
criteriul candidat:
sisk , i1,2,..,k-1 si-si+1>v; 4
1
2
3
1
4
4 1
3
(2,4,1,3,)
Fig. 17.
2
(3,1,4,2,)
Arborele gener ării solu ţ iilor n=4, v=1 30
Exemplu, dacă n=4, v=1, rezultatul din fi şierul de ieşire va fi: 2413 3142 2. Numere supermultimple
genera ţ i prin metoda backtracking toate numerele naturale cu n cifre (0
0). Un num ăr este super multiplu de k, dacă atît numărul cît şi toate numerele ob ţ inute din el prin t ăierea succesivă a cifrelor sale începînd cu cifra unit ăţ ilor sînt multiple de k. Valorile n şi k se introduc de la tastatur ă şi sînt corecte. Exemplu: pentru n=3 şi k=2, numărul 246 este "super multiplu" de k deoarece numerele 246, 24, 2 sînt multiple de k. (Bacalaureat, august 1999) Schema problemei: Enun ţ :
Problema intrare: n şi k din N; ieşire: toate numerele din N cu n cifre, supermultiple de k; Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul s cu n elemente în care s i multiplu de k
criteriul candidat:
sisk , i1,2,..,k-1 si multiplu de k;
3. Numere cu suma cifrelor constantă Enun ţ :
să se afişeze toate numerele formate din cifre distincte cu proprietatea că suma cifrelor este s. Valoarea variabilei S se cite şte de la tastatur ă, iar solu ţ iile vor fi afişate pe ecran. Exemplu: pentru s=3, se afi şează: 102, 12,120,201,21,210,3, 30 (Bacalaureat, iunie 2000) Schema problemei:
Problema intrare: s din N; ieşire: toate numerele din N cu cifre distincte, ce au suma cifrelor s;
31
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul cifrelor c cu maxim 10 elemente;
criteriul candidat: cick , i1,2,..,k-1 , ci s ; i 10
3
0
1
2 (3)
0
0
1
2 (1,2) 0
2 (1,0,2,)
Fig. 18
(1,2,0)
(2,1) 1
(3,0)
(2,0,1)
Arborele gener ării solu ţ iilor n=3 4. Litere distincte
Enun ţ :
Se citesc de la tastatur ă două numere naturale n şi m (0
Problema intrare: n şi m din N; ieşire: toate şirurile de n elemente distincte din primele m ale alfabetului englez;
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul soluţ ie s cu n elemente; 32
criteriul candidat: sisk , i1,2,..,k-1 4
1
2
1
2 3
4
3
3
4
1
2
4
1
3 2
Fig. 19.
Arborele gener ării solu ţ iilor n=2, m=4
5. Submulţimi de sumă dată -ordonate Enun ţ : Se citesc de la tastatur ă : două numere n (0
dintre cele date, fiecare mul ţ ime avînd proprietatea că suma elementelor ei este egal ă cu s. Fiecare mul ţ ime se va afişa pe o linie, elementele ei fiind scrise în ordine crescătoare, despăr ţ ite prin cîte un spa ţ iu sau cîte o virgul ă. Exemplu: n=7, s=61,şi valorile 12, 61, 22, 57, 10, 4, 23, se vor afi şa pe linii distincte următoarele mul ţ imi: 4,12,22,23 4,57 61 ( Bacalaureat, iunie 2001) Indica ţ ie: Asemănătoare cu problema 3, dar, aten ţ ie, numerele din şir pot fi şi negative; este recomandat ă ordonarea în prealabil a vectorului cu cele n valori. 6. Problema şirurilor de n cifre
S ă se genereze toate şirurile formate din n cifre, fiecare şir generat avînd următoarele propriet ăţ i: -con ţ ine numai cifre din mul ţ imea 1,2,3,4 ; -orice două cifre al ăturate sînt fie ambele pare fie ambele impare. Numărul natural n (3 n 15) se citeşte de la tastatur ă. Toate solu ţ iile vor fi scrise una după alta, cu spa ţ ii între solu ţ ii, fiecare şir fiind scris f ăr ă spa ţ ii între cifrele care-l formează. Enun ţ :
33
( Bacalaureat, august 2001) Schema problemei:
Problema intrare: n din N; ieşire: toate şirurile de n elemente cu cifre de aceeaşi paritate din mulţ imea 1,2,3,4;
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul soluţ ie s cu n elemente; criteriul candidat: (si-sk ) mod 2=0, i1,2,..,k-1 4
1
1
2
1
2 3
4
Fig. 20.
2
3
4 3
1 2
3
4 1 2
4 3
Arborele gener ării solu ţ iilor n=2
pentru n=2, se afişează (nu neapărat în aceast ă ordine) şirurile: 11 13 31 33 22 24 42 44 .
Exemplu:
7. Problema numărului minim de monezi 10). Se dau n tipuri de monezi (0 N Pentru fiecare tip exist ă un număr limitat de monezi. Trebiue s ă se pl ătească, atunci cînd este posibil, o suma dat ă S folosind un număr minim de monezi de tipurile date. a) S ă se descrie şi să se justifice un algoritm care rezolv ă problema dat ă; b) S ă se scrie un program care rezolvă problema. Programul accept ă la intrare N=numărul de tipuri de monezi, L i =numărul de monezi de tipul i (0 i n) şi S=suma de plat ă. Programul tipăreşte, pentru fiecare tip numărul de monezi necesare pentru plata sumei S.
Enun ţ :
34
( Examen de admitere-iulie 2001, Facultatea de Informatică, Iasi) Dacă vom plăti cu bancnote de valori mari, suma rămasă de plătit va scădea, iar numărul de bancnote folosit va fi mai mic. Exist ă valori ale bancnotelor pentru care dac ă plătim cu număr maxim de bancnote, începînd cu bancnotele cu valorile cele mai mari, prima solu ţ ie obţ inut ă va fi şi soluţ ia optimă cerut ă de problemă, dar acest lucru nu se întimplă întotdeauna. Rezolvînd prin backtracking reţ inem soluţ ia cu număr minim de bancnote în tabloul nrmin. Pentru a reduce durata execut ării programului, valorile cu care se va iniţ ializa nr i variază de la L i la 0 şi se renunţă la generarea unei soluţ ii dacă numărul de bacnote necesitat nrb devine mai mare sau egal cu numărul minim curent min. Procedînd astfel, num ărul de soluţ ii generate va fi redus iar algoritmul backtracking va fi mult mai eficient.
Indica ţ ie:
8. Problema parantezelor Enun ţ : genera ţ i toate şirurile de n paranteze rotunde, închise corect.
Exemplu: n=4, se ob ţ ine: ()() (()) (Olimpiada na ţ ional ă de informatică, 1995) Schema problemei:
Problema intrare: n (par) din N; ieşire: toate şirurile de n paranteze închise corect; Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul soluţ ie s cu n elemente codificate prin 1 (paranteze deschise) şi 2 (paranteze închise);
criteriul candidat: npd n pi;
npd n/2;
35
2
1
1
2
2 1
1
2
2 2 (1,1,2,2,)
(1,2,1,2,)
Fig. 21
Arborele gener ării solu ţ iilor n=3
9. Problema caselor de bani Enun ţ :
se consider ă o stivă de case de bani sub form ă de piramid ă. Astfel pe primul nivel vor fi n case, pe următorul n-1 case, apoi n-2, .., pînă la ultimul nivel unde va fi o singur ă casă de bani. Deci fiecare casă se va "sprijini" pe dou ă case de bani din etajul anterior, mai pu ţ in, cele din etajul de bază care se vor sprijini direct pe podea, în total fiind n(n+1)/2 case de bani. Se dau n(n+1)/2 saci cu bani, fiecare con ţ inînd o anumit ă sumă. S ă se distribuie aceşti saci, fiecare într-o casă, astfel încît în fiecare casă să fie exact atî ţ ia bani cît în cele dou ă cutii pe care se sprijină la un loc. Pentru casele din stratul de bază nu exist ă nici o condi ţ ie. Datele se vor citi dintr-un fişier cu următorul format : n s1 s2 ...sn(n+1)/2 unde n este numărul de cutii din stratul de bază, iar s1, s2.. sînt sumele de bani din fiecare sac. Rezultatul va fi afi şat pe ecran sub forma unei piramide în care sînt trecute sumele de bani din fiecare cutie. (Olimpiada na ţ ional ă de informatică, 1994) Schema problemei:
Problema intrare: n, s1 s2 ...sn(n+1)/2 din N, ; ieşire: ordinea de repartizare a sacilor; 36
Solu ţ ie:
Aplicarea paradigmei: reprezentarea solu ţ iei: vectorul soluţ ie s criteriul candidat:
-nu se poate poziţ iona un sac dacă într-una din cutiile de deasupra lui se găseşte o cantitate de bani mai mică sau egală cu cea din sacul curent; -nu se poate introduce un sac dac ă în una din cutiile de deasupra lui nu se găseşte nimic. Aceasta deoarece în continuare nu sînt decît saci cu o cantitate cel mult egală cu cea din scul curent, deci nu vom avea ce să punem în cutia de deasupra; -dacă în una din cutiile alăturate sacului curent se află deja introdus un sac, atunci vom verifica să fie respectat ă condiţ ia ca suma celor doi saci să se regăsească în cutia de deasupra lor;
Se porneşte de la o piramid ă iniţ ial goală, şi prin intermediul
unei proceduri - pune va introduce săculeţ ii. Sortînd sacii înainte de apelul procedurii, în ordine descresc ătoare a valorii conţ inut ă în ei, se va ţ ine cont de restricţ iile în poziţ ionarea sacilor (din criteriul candidat).
Avînd în vedere aceste condiţ ii, numărul de posibilit ăţ i de
alegere la fiecare pas se reduce drastic, rezultînd şi scăderea timpului de execuţ ie al programului. Exemplu: Sumele 9,8,17,4,5,3,1,1,2,3 se repartizează astfel: 17 8 3 1 Fig. 22
9 5
2
4 3
1
Repartizarea sacilor în casele de bani (n=4)
10. Problema preferinţelor dintre calculatoare şi studenţi Enun ţ : La
un concurs participă n (n<100) studen ţ i numerota ţ i de la 1 la n. Repartizarea celor n calculatoare, numerotate de la 1 la n, se face după preferin ţ e, fiecare student i, cu i de la 1 la n, va depune în timp util lista celor K i calculatoare preferate. De asemenea, cele n calculatoare au şi ele preferin ţ ele lor în rîndul celor n concuren ţ i. Fiecare calculator i, cu i de la 1 la n, va reprezenta în timp util o list ă a celor P i concuren ţ i prefera ţ i. O pereche concurent-calculator se nume şte "în consens" dacă cele două păr ţ i se prefer ă reciproc. Repartizarea concuren ţ ilor la 37
calculatoare se numeşte "stabil ă" dacă toate perechile sînt în consens. Furniza ţ i o repartizare o repartizare stabil ă care se poate ob ţ ine pe baza celor două seturi de preferin ţ e. Date de intrare: fişierul de intrare conţ ine datele pe 2n+1 linii avînd structura: n-numărul de calculatoare lista calculatoarelor preferate de concurentul 1 ......... lista calculatoarelor preferate de concurentul n lista concurenţ ilor preferate de calculatorul 1 ......... lista concurenţ ilor preferate de calculatorul n Date de ieşire: vor fi scrise in fişier sub forma: i1, j1 i2, j2 ..... in, jn În cazul în care nu exist ă nici o repartizare stabil ă, fişierul de ieşire va con ţ ine mesajul 'Repartizare imposibil ă'. (Olimpiada na ţ ional ă de informatică, 1999) Schema problemei:
Problema intrare: n, n liste cu calculatoarelor preferate de fiecare concurent, n liste cu concuren ţ ii preferaţ i de fiecare calculator;
ieşire: n perechi (în consens) calculator-student ;
Indica ţ ie:
Considerăm un graf bipartit G nn reprezentînd persoanele într-o parte şi calculatoarele pe cealalt ă parte. Din acest graf eliminăm iniţ ial toate arcele (i,j) dacă nu exist ă arcul (j,i). Trebuie să select ăm n muchii astfel încît oricare nod să fie atins de exact o muchie. Aceast ă cerinţă o realizăm prin backtracking: construim cu ajutorul procedurii recursive rec un vector d avînd n elemente în care pozi ţ ia i vom reţ ine calculatorul pe care va lucra persoana i. Deci soluţ ia va rezulta sub forma unor perechi: i, d i. Exemplu: Intrare: 4 1234 2 34 1 34 23
Ieşire: 1 2 3 4
3 2 4 1
38
1 234 11. Problema depozitării calculatoarelor
O firmă de comer ţ depozitează calculatoarele pe care le comercializează pe o rampă liniar ă în pozi ţ ii care pot con ţ ine un singur produs. Depozitarea şi extragerea calculatoarelor se face cu ajutorul unui stivuitor care porneşte întotdeauna de la cap ătul din stînga rampei. Pentru fiecare calculator C i se cunoaşte momentul d i al depozit ării şi momentul Li al livr ării, în următoarele condi ţ ii: -pentru orice i j, au loc d i d j , Li L j; -d i este mai mic decît L j, pentru orice i şi j; -timpii de lucru ai stivuitorului sînt neglijabili; Depozitarea unui calculator ci după o pozi ţ ie ocupat ă de un alt calculator c j, are costul constant p (cauzat de transportarea la în ăl ţ ime a calculatorului peste o pozi ţ ie); acelaşi cost apare şi la scoaterea din depozit a lui ci, dacă c j mai este în depozit. Dîndu-se pentru fiecare calculator valorile d i şi Li, să se determine costul minim însumat al depozit ărilor şi livr ărilor, corespunzător unei aşezări optimale pe rampă a calculatoarelor. S ă se găsească numărul de aşezări optimale ale calculatoarelor în depozit. Date de intrare: fişierul de intrare con ţ ine mai multe seturi succesive de date, fiecare set avînd structura: n, p -numărul de calculatoare, costul unei treceri 'peste'; d 1, L1 -momentele depozit ării/livr ării calculatorului c1; .... d n, Ln -momentele depozit ării/livr ării calculatorului cn; Date de ieşire: rezultatele se vor afi şa pe ecran astfel încît pentru fiecare set de date din fişierul de intrare să apar ă cîte o linie de forma: costmin, k unde k este numărul de aşezări optimale, echivalente din punctul de vedere al costului. (Olimpiada na ţ ional ă de informatică, 1999) Enun ţ :
Indica ţ ie: Presupunem că că două din cele n calculatoare au timpii de depozitare a, respectiv b (ay). Dacă primul calculator specificat prin perechea (a,x) îl amplasăm pe poziţ ia i, iar cel de-al doilea calculator îl amplasăm pe poziţ ia j (i
Exemplu:
Intrare: 4, 1 5, 50 7, 60 12, 40 20, 90 Ieşire: 4, 8.
40
III.6. Aplicaţii propuse 6.1. Probleme pentru consolidarea cuno ştinţelor şi lucrări de verificare P1. Care intre următoarele afirmaţ ii sînt adevarate şi care false? Metoda backtracking se poate implementa numai cu ajutorul subprogramelor recursive; Metoda backtracking evit ă generarea tuturor soluţ iilor posibile, urmat ă de verificarea condiţ iilor interne pentru fiecare solu ţ ie posibilă; Indiferent de problemă, aplicarea metodei backtracking conduce la cei mai eficienţ i algoritmi; P1. Succesiuni cu num ăr prim: Fie două numere naturale nenule n şi m şi A=1,2,..,n. Să se genereze elementele produsului cartezian AxAxA..xA (de m ori) cu proprietatea c ă suma tuturor componentelor este număr prim 2. P2. Produs cartezian pe litere: realizaţ i un program care, folosind tehnica backtracking tipăreşte produsul cartezian a n cuvinte citite de la tastatură, în fişierul 'Cart.txt'. O solu ţ ie a produsului cartezian conţ ine cîte un caracter din fiecare cuvînt şi se va scrie pe un rînd în fişier 17. P3. Generarea tuturor func ţ iilor injective f: AB, A şi B mulţ imi definite in diverese forme (numerice, literale) 18. P4. Problema delega ţ iei(1): d intr-o clasă de n elevi trebuie format ă o delegaţ ie alcătuit ă din m persoane. Scrieţ i un program care să determine toate posibilit ăţ ile de a forma delega ţ ia 18. P5. Problema delega ţ iei(2): Dintr-un grup de n persoane, dintre care p femei, trebuie format ă o delegaţ ie de k persoane, dintre care l femei. Să se precizeze toate delegaţ iile care se pot forma 18. P6. Problema m ărgelelor : Scrieţ i un program care să vizualizeze în mod text toate colierele de n (n natural>0) mărgele albe, roşii, galbene, verzi şi albastre care se pot construi respectînd următoarele reguli: -nu plasăm două mărgele de aceeaşi culoare în poziţ ii consecutive; -nu plasăm mărgele albe lîngă mărgele galbene şi nici mărgele verzi lîngă mărgele albastre; -nu utilizăm mai mult de n/2 m ărgele roşii. 41
P7. Problema melodiilor : La un festival de muzică pop, s-au înscris n melodii, codificate 1,2,..,n (n>3). S ă se afişeze toate posibilit ăţ ile de a stabili ordinea intrării în concurs a melodiilor, ştiind că melodiile cu codurile c1 şi c2 trebuie obligatoriu să evolueze a doua respectiv penultima. Valorile lui c1 şi c2 se citesc de la tastatură c1,c2 sînt din 1,2,..,n 2. P8. Problema descompunerii: să se afişeze toate modurile posibile de a descompune un număr natural n în sum ă de k numere naturale distincte (n şi k sînt cunoscute) 17. P9. Problema parit ăţ ii: să se afişeze toate numerele de n cifre distincte toate de aceeaşi paritate. P10. Problema steagului: avem la dispoziţ ie n culori. Să se precizeze toate drapelele tricolore care se pot proiecta, ştiind că trebuie respectate regulile: -orice drapel are culoarea din mijloc c1 sau c2; -cele trei culori de pe drapel sînt distincte 17. P11. Problema gîndacului: f ie o suprafaţă pătrat ă împărţ it ă în nxn pătrate identice, fiecare avînd o în ălţ ime dat ă. Un gîndac se g ăseşte iniţ ial în poziţ ia (i,j). S ă se determine dacă poate ajunge gîndacul în afara suprafeţ ei, ştiind că acesta poate doar să coboare şi nu poate să urce, pereţ ii fiind foarte abrupţ i. Dacă gîndacul poate să iasă din suprafaţă, să se determine toate variantele posibile 2. P12. Traseu minim în labirint: se d ă un labirint sub forma unei matrice binare cu n linii şi m coloane. Elementele egale cu 1 ale matricei indică spaţ iul liber pe unde se poate circula iar zerourile corespund zidurilor. O persoană se află în labirint în locul identificat prin linia i 0 şi coloana j0 Să se determine cel mai scurt traseu posibil de ie şire din labirint pentru acea persoană, dacă ieşirea este posibilă, deplasarea f ăcîndu-se doar în cele patru puncte cardinale 17.
42
6.2. Probleme propuse pentru examenul de bacalaureat P1. Patronul unei echipe de fotbal dore şte să-şi cumpere noi jucători. Cunoscînd valoarea S -suma avut ă la dispoziţ ie de patronul echipei şi sumele cerute de cluburile la care sînt titulari jucătorii doriţ i, scrieţ i programul care afişează ce jucători îşi poate cumpăra patronul, încadrîndu-se exact în suma avut ă la dispoziţ ie. (Variant ă Bacalaureat, iulie 1999) P2. Folosind metoda backtracking, scrie ţ i un program pentru aranjarea celor n cuburi etichetate de la 1 la n, de laturi Li şi culori Ci, i=1,n, astfel încît toate turnurile de k cuburi care se pot forma, s ă aibă cuburile aşezate în ordine descrescătoare, iar culorile cuburilor alăturate să fie diferite. (Variant ă Bacalaureat, iulie 1999) P3. Într-un magazin se g ăsesc spre vînzare n (n<21) produse, numerotate de la 1 la n. Un cumpărător, care dispune de o sum ă de bani S, doreşte să cheltuiască toţ i banii pe care îi are în acest magazin, dar f ără a cumpăra două produse de acelaşi fel. Cunoscînd pre ul ţ fiecăru produs, scrieţ i un program care să afişeze toate posibilit ăţ ile acestui cumpărător de a-şi cheltui banii. Se citesc de la tastatură valorile S, n şi apoi cele n numere întregi reprezentînd pre urile celor n produse. În fişierul de ieşire magazin.out se ţ vor scrie toate soluţ iile, cîte o soluţ ie pe fiecare linie. O solu ţ ie este constituit ă din numerele de ordine ale produselor cump ărate, separate prin cîte un spaţ iu. Exemplu: pentru n=5, S=100 şi pre urile celor 5 produse 20 50 70 30 ţ 60, fişierul magazin.out va avea următorul conţ inut: 34 124 Dacă nu exist ă soluţ ii, fişierul de ieşire va fi gol. (Variant ă Bacalaureat, iulie 1999) P4. Scrieţ i un program care afişează pe ecran toate secvenţ ele de n litere (n număr natural par citit de la tastatură) din mulţ imea A,R,G,V, secvenţ e care se pot construi respectînd următoarele reguli: -nu plasăm două litere identice una lîngă alta; -trebuie să utilizăm exact n/2 litere R Fiecare soluţ ie se va afişa pe cîte o linie a ecranului sub forma unui şir de litere. Exemplu: pentru n=2 se vor afi şa soluţ iile: 43
AR RA RG GR RV VR (Variant ă Bacalaureat, iulie 2000) P5. Să se genereze toate şirurile strict crescătoare formate din numere naturale cu proprietatea că primul element din şir este n, iar ultimul element al şirului este n+k. Numerele naturale n şi k (0
44
7.1. Finalit ăţi urmărite
elevii trebuie să în ţ eleagă mecanismul "căut ării cu revenire" specific metodei; să recunoască situa ţ iile care impun folosirea metodei; să implementeze corect algoritmi construi ţ i pe baza paradigmei backtracking; să analizeze complexitatea programelor realizate prin aceast ă metod ă;
7.2. Tipuri de gre şeli ce pot interveni în implementarea paradigmei Backtracking Greşelile pot apare în cadrul oric ărei etape de lucru, începînd cu proiectarea algoritmului şi pînă la procesul de implementare în limbaj, distingîndu-se următoarele tipuri de greşeli: mul ţ imilor M i în care pot lua valori elementele de pe fiecare nivel al stivei. Exemplu: În problema Numere cu suma cifrelor constant ă S (Bac'-2000) trebuia ţ inut cont că fiind vorba de cifre fiecare mul ţ ime Mi putea avea doar valorile 0..9 şi nu 0..S cum au interpretat unii elevi Identificarea
gre şit ă a
Alegerea
unei codifică ri greşite a datelor. În general trebuie avut grij ă la interpretarea dat ă elementelor din stivă (sol).
Neidentificarea corect ă a condi ţ iilor interne ale problemei. Exemplu: în problema gener ării perechilor de n paranteze care
se închid corect nu e suficient să impunem ca numărul de paranteze deschise să fie mai mare ca numărul de paranteze închise ci trebuie avut grijă ca numărul lor să nu depăşească jumătatea lui n. valid:=(npd>=npi) and (npd<=n div 2); Trebuie acordat ă o mare atenţ ie condiţ iilor interne ale problemei deoarece o identificare corect ă a acestora reduce numărul că ut ărilor sporind eficienţ a algoritmului. ţ iilor de continuare, acest tip de gre şeal ă Codificarea greşit ă a condi apărînd în general din dorin ţ a de exprimare cît mai simpl ă şi coincisă a lor. Exemplu: În problema reginelor în loc de condi ţ ia corect ă: for j:=1 to i-1 do if (x i =x j ) or (abs(x i -x j )=i-j)then valid :=false; se greşeşte frecvent la codificare, neglijînd faptul c ă reginele pot fi şi pe diagonala secundară, astfel omiţ îndu-se precizarea valorii absolte a 45
diferenţ ei; de asemenea elevii gre şesc la negarea condiţ iei considerînd operatorul logic and în loc de or ; La problema mul ţ imilor de sumă S (Bac- 2001) o gre şeală frecvent ă a fost aceea că elevii nu au ţ inut cont că elementele pot fi şi negative. Astfel dacă la nivelul k suma parţ ială era mai mare decît S se renunţ a la acel element deşi elementele de pe celelalte nivele puteau reface suma. Neconcordanţ a ar fi fost eliminat ă dacă ordonau vectorul valorilor imediat după citirea de la tastatură. Identificarea/codificarea
greşit ă
a situa ţ iilor în care se ajunge la o
solu ţ ie rezultat. Exemplu: în problema submul ţ imilor de sumă dat ă elevii sînt tentaţ i să facă verificarea egalit ăţ ii dintre sumele parţ iale şi suma cerut ă în funcţ ia valid, ceea ce este greşit; aceat ă verificare trebuie f ăcut ă după selecţ ia elementului, înainte de afişare.
Greşeli la implementarea opera ţ iei de afi şare a solu ţ iilor rezultat , fiind remediabil ă imediat far ă a afecta cu nimic logica programului.
Exemple: în problema submul ţ imilor de sumă dat ă nu întotdeauna soluţ ia conţ ine n elemente; deseori se aplica procedura standard de afi şare ce conţ ine secvenţ a: for i:=1 to n do write(a i ); de aceea trebuie avut grijă ca afişarea să se facă pînă la nivelul k, la care s-a realizat suma: for i:=1 to k do write(a i ); în problema vecinilor trebuie f ăcut ă o distincţ ie clară între valorile din vectorul a (al valorilor) şi valorile vectorului x (poziţ iile din stivă); sînt frecvente cazurile cînd afişarea se face mecanic prin secvenţ a for i:=1 to n do write(a i ) sau for i:=1 to n do write(x i ) în timp ce versiunea pentru selecţ ia corect ă a elementelor este: for i:=1 to n do write(a x i ). În
cazul implement ării recursive trebuie evitate greşelile care ţ in de implementarea în sine. Este des întîlnit ă situa ţ ia în care o variabil ă
care trebuie declarat ă local în procedura recursivă , apare declarat ă global . De asemenea, trebuie sporit ă aten ţ ia la declararea
parametrilor subprogramului respectiv. Exemplu: în problema parantezelor declararea variabilei i globală şi utilizarea acesteia în toate celelalte proceduri afectează execuţ ia corect ă a programului eroarea putînd fi rezolvat ă prin declarea lui i local; procedure par(k:integer); var i:integer; begin for i:=1 to 2 do
46