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 jejALG6 166 Rozdział 6. Derekursywacji kosztuje cenny czas procesora, który dodaje się do ogólnego czaET8 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 przeALG8 48 Rozdział 2. Rekurencja W celu dokładniejszego przeanalizowania algorytmu posłużymy się kilkALG8 68 Rozdział 3. Analiza sprawności algorytmów3.6. Nowe zadanie: uprościć obliczenia! Nic sposóbALG8 78___Rozdział 3 Analiza sprawności algorytmówZad. 3-4 Proszę rozwiązać następujące równanieALG8 88 Rozdział 4. Algorytmy sortowania Jest chyba dość oczywiste, że wywołania rekurencyjne zatrzALG 8 98 Rozdział 5. Struktury danych W następnych paragrafach zostaną przedstawione wszystkie metodALG8 108__Rozdział 5. Struktury danych5.1.3.Listy jednokierunkowe - teoria i rzeczywistość Oprócz pALG8 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 /> fizyczALG8 138 Rozdział 5. Struktury danych • „prawy” potomek /-tego węzła jest „schowany” pod indeksem 2ALG8 148 Rozdział 5. Struktury danych 148 Rozdział 5. Struktury danych „ nadchodzące" elementyALG8 158 Rozdział 5. Struktury{ if (p->t[rio_indeksu{słowo[i])]==NULL) test=0; // bidk odgałęzieALG2 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ącALG2 182 Rozdział 6. Derekursywatji 6, Jest to forma niewątpliwie równoważna, choALG6 186 Rozdział 6. Derekursywacja D(x); while((N!=i)44(N%2>) ) l N-N/2; C (x)więcej podobnych podstron