U ovom kodu, koji je ocigledno rekurzija:
Citat:
Code:
#include <iostream>
using namespace std;
char str[]="FELD";
int f(int k) {
if (str[k]=='\0')
return 0;
cout << str[k];
int res = 2+f((k+2)%5);
cout << str[k];
return res;
}
int main() {
cout << f(1);
return 0;
}
rezultat: EDFLLFDE8
... treba da zapazis par detalja:
1. ispis (cout) u samoj rekurzivnoj funkciji, pre ulaska u rekurziju (int res = 2+f((k+2)%5);)
2. ispis (cout) u samoj rekurzivnoj funkciji, posle rekurzije
3. konacno, ispis (cout) u main funkciji
Tako da se tvoj rezultat moze rasclaniti na 3 segmenta:
EDFL LFDE 8, pa je lakse da razumes sta se i kada desava.
Uslov za "izlazak" iz prvog segmenta je
(str[k]=='\0'), nakon cega se ide na deo ispod samog poziva rekurzije u funkciji (drugi segment). S obzirom da je ispis IDENTICAN, razlika ce biti samo u OBRNUTOM redosledu (EDFL <---> LFDE).
Treci segment, osmica (2 + 2 + 2 + 2) je: Broj ciklusa (4) * konstanta (2).
Zapazi da izmedju konstante
% 5 i
char str[]="FELD" postoji veza ( 5 == strlen(str) + 1), pa je to bolje sistemski resavati, a ne ovako "magicnim brojevima"
Ako ne mozes da pratis rekurziju, napravi sebi neki define makro (MY_TRACE), pa testiraj. Kada ne zelis makro, samo ga preimenuj MY_TRACE -> MY_TRACE1, i nece se videti suvisno.
Code:
#include <iostream>
using namespace std;
char str[]="FELD";
#define MY_TRACE
#ifdef MY_TRACE
int brojac_prolaza=0;
#endif
int f(int k)
{
#ifdef MY_TRACE
cout << endl << ++brojac_prolaza << ". prolaz" << endl;
cout << "FUNKCIJA f(" << k << ")" << endl;
if (str[k]=='\0')
{
cout << "str[" << k << "]=='\\0'" << endl;
cout << endl << "povratak, ispis je isti (cout << str[k]), samo ide unazad" << endl << endl;
}
#endif
if (str[k]=='\0')
return 0;
#ifdef MY_TRACE
cout << "PRVI cout() : ";
#endif
cout << str[k];
#ifdef MY_TRACE
cout << endl;
#endif
int res = 2 + f((k+2)%5);
#ifdef MY_TRACE
cout << "RES = 2 + f((" << k << "+2)%5) = " << res << endl ;
#endif
#ifdef MY_TRACE
cout << "DRUGI cout() : ";
#endif
cout << str[k];
#ifdef MY_TRACE
cout << endl << endl;
#endif
return res;
}
int main()
{
cout << f(1);
return 0;
}
//rezultat: EDFLLFDE8