182 Rozdział 6. Derekursywatji 6,
Jest to forma niewątpliwie równoważna, choć pozornie niewiele z niej na razie wynika. Przeanalizujmy jednak dokładniej działanie tego programu, starająca odtworzyć sekwencyjny sposób wywoływania grup instrukcji oznaczonych syniffl i licznie jako A(x). B(x) i C(x).
Widać od razu, iż każdorazowe spełnienie warunku instrukcji if... cl.se spowoduje aj pewno wykonanie A(x) i N+ + . Niespełnienie zaś warunku spowoduje jcdn> I krotne wykonanie C(.x). Tyle możemy zaobserwować odnośnie kodu obsługi- I wanego przed wywołaniem rekurencyjnym P.
Co się jednak dzieje podczas wywołań i powrotów rekurencyjnych? Otóż wy-1 konywana jest instrukcja B(x). oczy wiście wraz z N~. Jeśli teraz zdecydujemy się I na zasymulowanie operacji wywoływania i powrotu rckurencyjnego poprzez-11 odpowiednio - /V++ i N~, możliwe jest zaproponowanie następującej równo- 'II ważnej formy procedury P:
int M=0; void P()
t
do
I
while(warunek(a))
(
A(x) ;
M++;
)
C (x) ; if(N==0)
goto koniec;
N--;
B(x) ;
)while(N!=0); koniec:
)
Czytelnik, którego nie przekonał ten wywód, może znaleźć bardziej ścisły matę- | matycznie dowód prawidłowości powyższej transformacji w [Kro89], Na użytek I tego podręcznika zdecydowałem się jednak na zamieszczenie mniej formalnego I wyjaśnienia - tym bardziej, że zagłębianie się w dywagacje na temat derekur- I sywacji ma bardzo mało wspólnego z algorytmiką, a bardzo wiele z „dziw- I nymi” sztuczkami łatwo prowadzącymi do przyjęcia złego sty lu programowania.
Weźmy pod uwagę schemat rekurencyjny przedstawiony na listingu poniżej:
void P()
(
if (warunek(x))