ALG6

ALG6



36 Rozdział 2. Rekurencja

każemy. W rozdziale 9 zostanie omówiona ciekawa technika programowania (tzw. programowanie dynamiczne) pozwalająca poradzić sobie z powyższą wadą.

2.4.2.Stack overflow!

Tytuł niniejszego podrozdziału oznacza po polsku „przepełnienie stosu”. Jak wykazuje praktyka programowania, pisanie programów podlega regułom raczej świata magii i nieokreśloności niż naszym zachciankom. Ile razy zdarzało się nam „zawiesić” komputer (przez co rozumiemy powszechnie stan, w którym program nie reaguje na nic i trzeba mu zasalutować trzema klawiszami") naszym programem? Zdarza się to nawet najbardziej uważnym programistom i stanowi raczej nieodłączny element pracy programistycznej...

Istnieje kilka typowych przyczyn „zawieszania” programów:

•    zachwianie równowagi systemu operacyjnego przez „nielegalne” użycie jego zasobów;

•    „nieskończone” pętle;

•    brak pamięci;

•    nieprawidłowe lub niejasne określenie warunków zakończenia programu;

•    błąd programowania (np. zbyt wolno wykonujący się algorytm).

Programy rekurencyjne są zazwyczaj dość pamięciożerne: z każdym wywołaniem rckurcncyjnym wiąże się konieczność zachowania pewnych informacji1 niezbędnych do odtworzenia stanu sprzed wywołania, a to zawsze kosztuje trochę cennych bajtów pamięci. Spotyka się programy rekurencyjne, dla których określenie maksymalnego poziomu zagłębienia rekurencji podczas ich wykonywania jest dość łatwe. Analizując program obliczający 3! widzimy od razu, że wywoła sam siebie tylko 3 razy; w przypadku funkcji fib szybka „diagnoza” nie przynosi już tak kompletnej informacji.

Przybliżone szacunki nie zawsze należą do najprostszych. Dowodzi tego chyba najlepiej funkcja funkcja MacCarthy’ego, zaprezentowana poniżej:

rek4.cpp

unsigned long int MacCar tliy (int x) {

if (x>100)

1

Ctrl-ALT-Del w systemie DOS, instrukcja kil! w systemie Unix...

' W szczegóły wnikać nie będziemy, gdyż tematyka ta nie ma dla nas większego znaczenia w tym miejscu.


Wyszukiwarka

Podobne podstrony:
ALG6 46_ _ Rozdział2. Rekurencja rekurencyjnych jest pamięcioźerność: wielokrotne wywołania rekuren
ALG6 106 Rozdziała. Strukturydanjt 5.1 będzie ich fuzją. Rekurencyjny zapis tego procesu jest bardz
ET6 36 Rozdział 3. Funkcje turystyki Znaczenie funkcji wypoczynkowo-zdrowolnej turystyki nie ograni
ALG6 26 RozdziaH. Zanim wystartujemy 1.5 metody niezmienników (zwanej niekiedy metodą Floyda). Mają
ALG6 56 Rozdział 3. Analiza sprawności algorytmów jest intuicyjnie bardzo proste, dalej będziemy uż
ALG6 66 Rozdział 3. Analiza sprawności algorytmów return pos; else    //element zost
ALG6 76 Rozdział 3. Analiza sprawności algorytmów Analogicznie dla 2 otrzymamy: Vn > 1, A(n,2) =
ALG6 86 Rozdział 4. Algorytmy sortowania zamiany sąsiadujących ze sobą elementów, a druga będzie wy
ALG 6 96 Rozdział 5. Struktury danych Rys. 5 - 3. FCOOh FCI4h FFEEh Przykład listy jedno-kierunk
ALG6 116 Rozdział 5. Struktury danych Iisla2.li int alfabetycznie(ELEMENT *q],ELEMENT *q2) { II czy
ALG6 126 Rozdział 5. Struktury danych Rys. 5 - 12. Metoda„ tablic równoległych " (2) DANE L2
ALG6 136 Rozdział 5. Struktury danycł forfint i=0; i<4;i+~) kolejka.wstaw(tab[i)); for(i=0;
ALG6 146 Rozdział 5. Struktury danycti Jak widać, inteligentne użycie tablic może nam podsunąć możl
ALG6 156 Rozdział 5. Struktury danya Proces przechadzania się po drzewie nie jest bynajmniej zakońc
ALG6 166 Rozdział 6. Derekursywacji kosztuje cenny czas procesora, który dodaje się do ogólnego cza
ALG6 186 Rozdział 6. Derekursywacja D(x); while((N!=i)44(N%2>) ) l N-N/2; C (x)
ALG6 176 Rozdział6. Derekursywacja
freakpp082 162 W tym rozdziale zostanie omówiona tylko metoda różnic skończonych w zastosowaniu do z

więcej podobnych podstron