Informatică, întrebare adresată de aAlexandr, 9 ani în urmă

Vreau un mod de rezolvare pentru problema 3, subiectul III, sesiunea specială 2019, limbajul C/C++. Nu mai stiu cum sa construiesc functia recursiva, sau cel putin nu pe asta...
Mulțumesc anticipat.

Anexe:

Răspunsuri la întrebare

Răspuns de boiustef
1

Răspuns:

propun două variante... prima, cu vector,  (fără recursie) ce lucrează foarte repede şi memoria nu e atît de ocupată cu 10000 de elemente în vctor...

A doua variantă, cu recursie, care pentru n mai mare ca 30 âncepe să gâfâie, ia foarte mult timp, deoarece fiecare apel a funcţiei recursive aduce după sine încă 3 apeluri...

Eu îi dau prioritate primei variante...

Explicație:

************** varianta cu vector (nerecursivă) ************

#include <iostream>

#include <fstream>

using namespace std;

ofstream g ("bac.txt");

int n,x,y,z,v[10001],i;

int main()

{

   cout << "n= "; cin >> n;

   cout << "x= "; cin >> x;

   cout << "y= "; cin >> y;

   cout << "z= "; cin >> z;

   v[0]=x; v[1]=y; v[2]=z;

   for (i=3; i<n; ++i)

   {

       v[i]=v[i-1]+v[i-2]-v[i-3];

   }

   for (i=n-1; i>=0; --i)

       g << v[i] << " ";

}

************ varianta recursivă ************

#include <iostream>

#include <fstream>

using namespace std;

ofstream g("bac.txt");

int n,x,y,z;

int f(int n)

{

   if (n==1) {  return  x; }

   else

   {

       if (n==2) { return y;}

       else

       {

           if (n==3) { return z;}

           else return f(n-1)+f(n-2)-f(n-3);

       }

   }

}

int main()

{

   cout << "n= "; cin >> n;

   cout << "x= "; cin >> x;

   cout << "y= "; cin >> y;

   cout << "z= "; cin >> z;

   if (n==1) g << x;

   else

   {

       if (n==2) g << y << " " << x ;

       else

       {

           if (n==3) g << z << " " << y << " " << x;

           else

           {

               for (int i=n; i>3; --i)

                   g << f(i) << " ";

                g << z << " " << y << " " << x;

           }

       }

   }

}


boiustef: se observă că se primesc două progresii aritmetice, prima cu primul termen x, a doua cu primul termen y, ambele cu raţia r=z-x.
prima progresie e pentru indici impari, a doua - pentru indici pari
boiustef: mdaaaa, am mers după ideea ta cu recursie , dar aici ce ce idee frumoasă... :))) dar nu regret, m+'-am antrenat şi la recursie....
aAlexandr: :)) multumesc mult! Imi iesise de dimineata recursivitatea, dupa care am dicutat cu colegii despre eficienta si am dat peste formulele acestea. Imi pare bine, totusi ca problema a fost rezolvata
boiustef: cunosc sentimentul... :))), o seară frumoasă
aAlexandr: Tarziu, stiu... dar multumesc
boiustef: ???
aAlexandr: #pentru o seara asa cum a fost ...:)) (zic asta pentru ca am mai reusit ceva :))) )
boiustef: da, e important să nu treacă ziua în zadar... acea problemă cu număr asociat nu-mi vine ceva să-mi placă... pînă ce cred că tr. de lucrat cu caractere, şiruri de caractere
aAlexandr: e gata si aceea
boiustef: bravo... care e ideea?
Alte întrebări interesante