Programiranje

Pomoć, C++, rekurzija

dnadj pon 5.1.2009 21:01

Napisati program koji će empirijski prebrojati koliko se puta može jednostavna funkcija ( povratni tip void, prazna definicija ) pozvati rekuzivno.Dobiveni ekspirementalni rezultat ispisati na ekran i završiti program.

Mad ID pon 5.1.2009 21:21

Errr, vrlo cudan zadatak. Ono sto je sigurno je da to ne mozes rijesiti rekurzijom (IMHO, no opet ja nisam programer) jer rekurzija predaje parametar sljedecem pozivu.

 

Ja bi se na tvom mjestu pravio glup i rijesio problem na banalan način. Kreiraj neku varijablu count=0 i inicijaliziraj pointer na nju. U funkciju samo stavi uvećavanje podatka di pokazuje pointer. Tko god ti je to zadao ima za cilj da naucite da stog nije beskonacan :) Imas na netu točan ANSI C opis sto se stavlja na stog kad se poziva funkcija. Ne sjecam se previse toga no definitivno ide povratna adresa (4Byte-a)

 

Pozdrav od NEProgramera.

Private pon 5.1.2009 22:55

 

 

Ne znam ,možda ovako....;

#include <iostream>

using namespace std;

void rekurzija ( int brojac )
{
    // svaki poziv se broji
  cout<< brojac <<"\n";  
  rekurzija ( brojac + 1 );
}

int main()
{
  rekurzija ( 1 ); //prvi poziv ,od jedan       
}
//Program se rusi naravno ali ti pokazuje broj poziva
//funkcija je tipa void

Naravno da ovakvo programiranje je loše i da samo dokazuje da je sama rekurzija bez uvjeta opasna...jer kod nekih kompajlera može izazvati
reset(na taj način prekinuti program).
Onaj tko ti je dao taj zdatak valjda ima i to u cilju...dokazivanje ograničene uporabe rekurzija u npr. matematici...fibonacci,faktorijel itd;
Oni se tako mogu lijepo riješiti  pomoću rekurzije.
Može se dosta pisati o tome i kako to nije dobro naravno za memoriju...stvaraju se kopije svakim pozivom i slični problemi....





Tracer uto 6.1.2009 00:25

Ovaj zadatak je puno lukaviji nego što mislite i vjerujem da bi čak dosta profesionalnih programera na njemu "polomili zube".

 

Prvo, rekurziju treba prisiliti da uzastopnim pozivima napuni Stog, nakon čega se generira StackOverflow exception. Znači, trik zadatka je zapravo da se vidi da li znate uhvatiti exception ovog tipa. Štoviše, fora je u tome što će većina tu iznimku pokušati hvatati na klasični try-catch način, i tu se zapravo vidi tko zna, a tko ne zna programirati, jer ovdje nije riječ o običnim C++ iznimkama već o SEH-u (Structured Exception Handling). Svi pokušaji da se ova iznimka uhvati na klasičan način će biti uzaludni, no ovdje se nije nitko sjetio niti da na taj način pokuša...

 

Pa evo rješenja:

 

#include <iostream>
#include <windows.h>
using namespace std;

int n = 0;

void f(){
    n++;
    f();
}
int main(int argc, char* argv[])
{
    __try{
         f();
    }
    __except(GetExceptionCode() == EXCEPTION_STACK_OVERFLOW
    ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        cout << n;
    }
    cin.get();
    return 0;
}