2. Găsiţi greşala în funcţia de mai jos.
int suma(int i)
{if (i==0)
return 0;
else
if (a[i]%2==0)
return suma(i+1)+a[i];
else return suma(i-1);
}

Răspuns :

Mai intai de a gasi greseala trebuie sa stim ce ar trebui sa faca functia.

Presupun ca functia suma primeste un parametru numar intreg care calculeaza suma intr-un vector (in care indexarea incepe de la 1). Functia calculeaza recursiv suma elementelor din vector de pe pozitii pare (intr-un mod ineficient.)

In primul rand trebuie sa modificam "return suma(i+1)+a[i]" cu "return suma(i-1)+a[i]" pentru a scapa de bucla infinita (si pentru a calcula ce trebuie sa calculam).

In al doilea rand ar trebui sa implementam un sistem de validare mai bun (daca i este negativ s-ar putea sa avem probleme). Pentru simplitate daca i este negativ se va returna valoarea 0.

In al treilea rand acele instructiuni else-uri sunt redundante. Daca functia returneaza o valoare instructiunile ulterioare nu mai sunt executate.

Astfel functia devine :

int suma(int i)

{if (i<=0) return 0;  

if (a[i]%2==0) return suma(i-1)+a[i];

return suma(i-1);

}