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

Buna!
Invat metoda Divide et Impera, intuitiv reusesc sa fac problemele, dar nu inteleg inca constient fiecare pas ce se intampla in memoria calculatorului. Spre exemplu in algoritmul de mai jos, unde trebuie sa gasesc cel mai mare element dintr-un vector (algoritm functional), nu inteleg ce se intampla, cum si unde se retine cel mai mare element, cand compar a cu b la fiecare reapel. De asemenea, nu inteleg ce e cu conditia aceia if (s==d) return v[s]; , ca la recursivitate, dar nu inteleg ce rol are aici. Imi poate explica cineva detaliat? As fi foarte recunoscator.


#include

using namespace std;
int maxim (int v[100], int s, int d)
{
if (s==d)
return v[s];
else
{
int m=(s+d)/2;
int a=maxim(v,m+1,d);
int b=maxim(v,s,m);
if (a>b)
return a;
else
return b;
}
}
int main()
{
int n,v[100];
cin>>n;
for (int i=0;i cin>>v[i];
cout< return 0;
}

Răspunsuri la întrebare

Răspuns de Porecla0987
0

s == d este conditia de iesit din recursivitate, adica cazul de baza.

Daca ai alte nelamuriri, intreaba mai detaliat.


sikesjack1: Comparatiile if (a>b) se stocheaza pe cate un nivel al stivei si cand se termina apelurile se face comparatii succesive? Sau cum functinoeaza?
Porecla0987: Raspunsul o sa fie impartit pe mai multe bucati, deoarece sunt limitat la 500 de caractere / raspuns.

E exact ca la recursivitate. main apeleaza maxim(v, 0, n-1); maxim(v, 0, n-1) apeleaza maxim(v, (n + 1) / 2 + 1, n) si maxim(v, 0, (n + 1) / 2); apoi fiecare dintre ele apeleaza alte 2, pana se intalneste careva dintre ele (evident careva dintre ultimele) cu s == d, apoi se intorc in ordinea inversa cum au fost chemate si returneaza fiecare ce are de returnat.
Porecla0987: Cu toate ca codul tau este gresit (acceseaza v[n + 1], ceea ce evident nu exista), o sa presupun ca este corect, sa intelegi cum functioneaza.
Uite un exemplu mai simplu, sa intelegi:
Porecla0987: v = [2, 1, 3]
n = 3
maxim(v, 0, n) -> maxim(v, 2, 3) -> maxim(v, 3, 3); in acest moment maxim(v, 3, 3) returneaza v[3], adica 3 (ceea ce nu exista, dar majoritatea compilatoareor o sa-ti returneze ultimul element, deci ai noroc) in variabila 'a' a functiei ce a chemat-o (maxim(v, 2, 3)). In momentul in care returneaza toate valorile functiei sunt sterse din stack.
Porecla0987: Asta e doar jumatate din ce se intampla (am aratat doar partea pentru variabila 'a'), exact acelasi lucru se intampla si pentru variabia 'b', doar ca cu alte numere.
Porecla0987: Ca fapt divers, programul tau nu este o "stiva". Stiva este o parte a memoriei computerului care functioneaza pe principiul FIFO (First In, First Out), avand doar 2 functii foarte importante: push (impinge un element in stiva) si pop (elimina un element din stiva) si este administrata automat de procesor, deci nu-i nevoie sa aloci si sa eliberezi memoria manual.
Poti citi mai multe cu un search pe Google: "memory stack"
Porecla0987: Daca explicatiile sunt prea compicate / nu intelegi ceva, intreaba.
Alte întrebări interesante