Informatică, întrebare adresată de Rayzen, 8 ani în urmă

Recursivitate.

Proiectați un algoritm polinomial pentru a calcula valoarea ALG(n,k).

Am nevoie de subpunctul c.

Anexe:

Ol3g: ahh, dar tu faci for k=0 thru n?
Rayzen: adica, de exemplu.
ALG(2,1) = ALG(1,1) + ALG(1,0) = 1+1 = 2
Rayzen: Cred ca da. Nu stiu exact la ce se refera prin algoritm polinomial.
Rayzen: Acesta e un model de subiect de examen.
Ol3g: nu am avut programare de genul acesta
Rayzen: E din recursivitate.
Ol3g: nu e plaja mea. Nu pot să te ajut :D
Rayzen: Okk. ȘD
Rayzen: mersi oricum :)
Ol3g: (:

Răspunsuri la întrebare

Răspuns de boiustef
2

Răspuns:

#include <iostream>

using namespace std;

long long n,k,m,p1=1,p2=1,i,ALGnk;

int main()

{

   cin >> n >> k;

   for (i=n; i>k; --i )

       p1=p1*i;

   m=n-k;

   for (i=2; i<=m; ++i)

       p2=p2*i;

   ALGnk=p1/p2;

   cout << ALGnk;

   return 0;

}

Explicație:

Am văzut că algoritmul ALG calculează numerele din triunghiul lui Pascal. Cum s-a propus să calculăm ALG(5,3), asta e termenul de pe linia cu indicele 5 şi coloana 3. Metoda recursivă este o metodă ca aspect simplă, dar cu o mare risipă de memorie şi timp. În subpunctul a) tr. să înţelegem şi argumentăm că algoritmul recursiv este exponenţial ( O(2^k), mai discutăm la aceast subiect...).  O parcurgere for i - -- for j  ne dă un algoritm O(n^2), adică polinomial. Asa algoritm ar fi să generăm Triunghiul lui Pascal până la numărul solicitat, folosind formula recurentă a[i][j]=a[i-1][j] + a[i-1][j-1].

Codul postat de mine aici realizează o complexitate O(n) , deci e tot polinomial. Se ştie de la mate, că o linie a triunghiului lui Pascal sunt coieficienţii binomiali Combinări din n luate câte k, unde k ia valori de la 0 la  n. Atunci termenul ALG(5,3) este Combinări din 5 luate câte 3. Pentru calcularea lui am folosit formula combinărilor. şi atât... :)))

Ceva neclar, întreabă...  


boiustef: eu superfecial am atins problema asta, aşa că întreabă la unul mai competent... :)))
Rayzen: CinevaFaraNume
Rayzen: Am vazut ca le stie bine.
boiustef: Eu sunt ex profesor de mate cu facultate terminată în 1974 şi am mai lucrat şi la info, dar nu am atins mari performanţe...
boiustef: da, am observat şi eu că are o f.b. pregătire...
Rayzen: Wow.!
Eu pana acum am crezut ca esti de o varsta cu mine :O
boiustef: :))) 67 de ani
Rayzen: Multi inainte !!
boiustef: mersi, asemenea
Rayzen: Mersi
Alte întrebări interesante