186

Rozdział 6. Derekursywacja

D(x);

while((N!=i)44(N%2>)

)

l

N-N/2; C (x) ;

if(N==l)

goto koniec? N=N+1;

B {x) ;

}while(p!=1)i

)

Dla zilustrowania metody rozważmy jeszcze raz problem wież Hanoi, przedstawiony na stronie 170.

Mając do dyspozycji metodę funkcji przeciwnych (patrz §6.5) łatwo dojdziemy do następującej wersji zaproponowanej tam procedury:

luwoijt.cpp I

void hanoi()

<

if (n!=1)

I

n—; b=3-a-b; hanoi();

n4 + ;    b-3-a-b;

cout << "Frzesuh dysk nr ”<<n<< ” z ” << a << " na "«b<<endl; n--; a=3-a-b; hanoi () ; n++; a=3-a-b;

I

else

cout << "Przesuń dysk nr ”<<n<< " z " << a « " na " <■< b << endl; t

Zauważmy, żc instrukcje n++ i n— anulują się wzajemnie, mogą być zatem po prostu usunięte.

Jeśli poddamy procedurę hanoi przeróbce na wersję iteracyjną, powinniśmy otrzymać:

void hanoi_iter()

I

int M=l; do