wywołanie rekurencyjne a używana pamięć

wywołanie rekurencyjne a używana pamięć
PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
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:

Kopiuj
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.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
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).

PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
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;)

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
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ś.

PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 211
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ęć

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.