Sunteți pe pagina 1din 4

Implementarea recursivă

Prelucrările care se fac pentru nivelul k al soluţiei se fac şi pentru nivelul k+1 al
soluţiei – şi aceste prelucrări pot fi apelate pentru elementul k+1 al soluţiei, iar
trecerea de la elementul k al soluţiei la elementul k+1 al soluţiei se face prin apelul
recursiv al acestor prelucrări. În cazul implementării recursive, condiţia de bază este
ca pentru nivelul k să nu se găsească o valoare care să îndeplinească condiţiile
interne.

void bt(int k) //partea fixă a algoritmului


{init(k); //se iniţializează elementul k al vectorului soluţie
while(succesor(k)) //cât timp se găseşte succesor pentru elementul k
al soluţiei
if(valid(k)) //dacă succesorul este element al soluţiei
if(solutie(k)) //dacă s-au obţinut toate elementele soluţiei
tipar(k); // atunci se afişează elementele soluţiei_
else bt(k+1); //altfel se apelează subprogramul pt a găsi
elementul k+1 al soluţiei
}
void main()
{ ... bt(1); ... }
Probleme rezolvabile prin metoda backtracking

Generarea permutărilor
1. Implementarea iterativă

#include<iostream>
using namesapce std;
int n,k,ev,as,s[100];
void init()
{s[k]=0;}
int succesor()
{if (s[k]<n)
{s[k]=s[k]+1; return 1;}
else return 0;}
int valid()
{for(int i=1;i<k;i++)
if (s[k]==s[i]) return 0;
return 1;}
int solutie()
{return k==n;}
void tipar()
{for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
cout<<endl;}
void bt()
{k=1;
init();
while (k>0)
{as=1; ev=0;
while(as && !ev)
{as=succesor();
if(as) ev=valid();}
if(as)
if (solutie()) tipar();
else {k++; init();}
else k--;}}
int main()
{cout<<"n= "; cin>>n;
bt();
return0;}

2. Implementarea recursivă
#include<iostream>
using namesapce std;
int n, s[100];
void init(int k)
{s[k]=0;}
int succesor(int k)
{if (s[k]<n)
{s[k]=s[k]+1; return 1;}
else return 0;}
int valid(int k)
{for(int i=1;i<k;i++)
if (s[k]==s[i]) return 0;
return 1;}
int solutie(int k)
{return k==n;}
void tipar()
{for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
cout<<endl;}
void bt(int k)
{init(k);
while(succesor(k))
if(valid(k))
if(solutie(k)) tipar();
else bt(k+1);}
int main()
{cout<<"n= "; cin>>n;
bt(1);
return 0;}

S-ar putea să vă placă și