wywołanie rekurencyjne a używana pamięć

0

Witam, chciałem zapytać w jaki sposób wywoływać funkcję rekurencyjną pracującą na tablicy, aby nie tworzyć nowego miejsca w pamięci tylko pracować na tym samym. Np taka przykładowa funkcja:

void rekurencyjna(double *tab, int param){
	param++;
	tab[0] = tab[1] = param;
	rekurencyjna(tab, param);
}

Funkcja jest tylko przykładem, problem mam z inną funkcją w której używam tablic, a program nie spełnia wymogów przez przekroczenie pamięci.

0

To co tutaj podałeś to tzw wywołanie ogonowe, a GCC zwykle optymalizuje wywołania ogonowe do pętli. Jeśli masz jakieś wywołanie, które nie jest wywołaniem ogonowym to prawie zawsze (w potocznym sensie :-P ) takie wywołanie zajmuje kolejny kawałek stosu (tzn tworzy kolejną ramkę, odkłada parametry na stos, alokuje miejsce na zmienne lokalne, itp itd).

0

Dokładnie mam problem z algorytmem "magiczne piątki" http://smurf.mimuw.edu.pl/node/327 , w tej funkcji tworzy się jeszcze kilka tablic i tak dalej. Mój kod przekracza dozwolony limit o 99% tak więc jakoś muszę to zoptymalizować jednak nie bardzo wiem jak;)

0

Wcale nie musisz w tym algorytmie tworzyć nowych tablic. Zamiast tworzyć nowe tablice możesz tworzyć trójki: (offset w oryginalnej tablicy, ilość elementów, odstęp między elementami w oryginalnej tablicy) i na tym operować.

Mogłeś też coś sknocić i dostałeś nieskończoną rekurencję gdzieś.

0

faktycznie chyba trzeba będzie to zrobić w ten sposób. Sknocić raczej nic nie sknociłem bo program się wykonuje do końca i daje poprawne wyniki, jednak przekracza dozwoloną pamięć

1 użytkowników online, w tym zalogowanych: 0, gości: 1