ALG8

ALG8



168 Rozdział 6. Derekursywacjł

Jak odróżnić powrót z procedury P, który powoduje definitywne jej zakończenie, od tego, który przekazuje kontrolę do Instr2? Okazuje się, że jedyny łatwy do zautomatyzowania sposób polega na użyciu tzw. stosu wywołań rekurencyj-nych (patrz również §5.3).

Zarządzanie powrotami z wywołań rekurencyjnych wymaga uprzedniego zapamiętywania dwóch informacji: tzw. otoczenia (np. wartości zmiennych lokalnych) i adresu powrotu, dobrze nam znanego z poprzedniego przykładu. Podczas wywołania rekurencyjnego następuje zapamiętanie na stosie tych informacji i kontrola jest oddawana procedurze. Jeśli wewnątrz niej nastąpi jeszcze raz wywołanie rekurencyjne. to na stos zostaną odłożone kolejne wartości otoczenia i adresu powrotu - różniące się od poprzednich. Podczas powrotu z procedury rekurencyjnej możliwe jest odtworzenie stanu zmiennych otoczenia sprzed wywołania poprzez zwykłe zdjęcie ich ze stosu.

Kompilator „wie”, gdzie ma nastąpić powrót, bowiem adres (argument instrukcji goło') także został zapamiętany na stosie. Testując stan stosu możliwe jest określenie momentu zakończenia procedury: jeśli stos jest pusty, to wszystkie wywołania rekurencyjne już „się” wykonały.

Oto jak możliwe byłoby zrealizowanie w formie sekwencyjnej poprzedniego przykładu:

start:

procedura -i wywołania rekurencyjne


powroty z wywołań rekurencyjnych


ASM(Instr1) push(Otoczenie, etl) x=F(x) goto start etl:

ASM{InstrŻ) if_not(StosPusty)

pop(Otoczenie, Addr) Odtwórz(Otoczenie) goto Addr

)

)

To tyle tytułem wstępu. W dalszej części rozdziału przystąpimy już do kilku prób tłumaczenia algorytmów rekurencyjnych na iteracyjne.

4 Warto przypomnieć, że instrukcja goto istnieje również w C++.


Wyszukiwarka

Podobne podstrony:
ALG8 178 Rozdział 6. Derekursywacja 6.! Dużą wadą nowej techniki będzie niemożność łatwego jej
ALG6 166 Rozdział 6. Derekursywacji kosztuje cenny czas procesora, który dodaje się do ogólnego cza
ET8 168 Rozdział 10. Polityka turystyczna ubezpieczenia na rzecz klientów w związku z prowadzoną
ALG8 18 Rozdziali. Zanim wystartujemy dopóki a>0 wykonuj; podstaw za c resztę z dzielenia a prze
ALG8 48 Rozdział 2. Rekurencja W celu dokładniejszego przeanalizowania algorytmu posłużymy się kilk
ALG8 68 Rozdział 3. Analiza sprawności algorytmów3.6. Nowe zadanie: uprościć obliczenia! Nic sposób
ALG8 78___Rozdział 3 Analiza sprawności algorytmówZad. 3-4 Proszę rozwiązać następujące równanie
ALG8 88 Rozdział 4. Algorytmy sortowania Jest chyba dość oczywiste, że wywołania rekurencyjne zatrz
ALG 8 98 Rozdział 5. Struktury danych W następnych paragrafach zostaną przedstawione wszystkie metod
ALG8 108__Rozdział 5. Struktury danych5.1.3.Listy jednokierunkowe - teoria i rzeczywistość Oprócz p
ALG8 118 Rozdział 5. Struktury danych if(pŁzed==NULL) // wstawiamy na początek listy ( inf_ptr[nr].
ALG8 128 Rozdział 5. Struktury dam i W zależności od konkretnych potrzeb można element /> fizycz
ALG8 138 Rozdział 5. Struktury danych • „prawy” potomek /-tego węzła jest „schowany” pod indeksem 2
ALG8 148 Rozdział 5. Struktury danych 148 Rozdział 5. Struktury danych „ nadchodzące" elementy
ALG8 158 Rozdział 5. Struktury{ if (p->t[rio_indeksu{słowo[i])]==NULL) test=0; // bidk odgałęzie
ALG2 172 Rozdział 6. Derekursywacja Wzmiankowany powyżej „tajemniczy sposób” nie powinien stanowić
ALG4 174 Rozdział 6. Derekursywatp 6.4. to dlaczego nie wspomnieliśmy o tym wcześniej, wprowadzając
ALG2 182    Rozdział 6. Derekursywatji 6, Jest to forma niewątpliwie równoważna, cho
ALG6 186 Rozdział 6. Derekursywacja D(x); while((N!=i)44(N%2>) ) l N-N/2; C (x)

więcej podobnych podstron