09.05.2013 Views

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

Algoritmos y Programación en Pascal

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

366 Capítulo 17. Estructuras de datos recursivas<br />

Dicho de otro modo, la recursión se puede transformar <strong>en</strong> un par de bucles<br />

que se obti<strong>en</strong><strong>en</strong> apilando las llamadas recursivas (primer bucle) para después ir<br />

evaluándolas una a una (con el segundo bucle).<br />

Un ejemplo servirá para aclarar estas ideas; supongamos que t<strong>en</strong>emos una<br />

función definida recursivam<strong>en</strong>te, como, por ejemplo, la función factorial (véase<br />

el apartado 10.1):<br />

function Fac(num: integer): integer;<br />

{PreC.: num ≥ 0}<br />

{Dev. num!}<br />

begin<br />

if num = 0 th<strong>en</strong><br />

Fac:= 1<br />

else<br />

Fac:= num * Fac(num - 1)<br />

<strong>en</strong>d; {Fac}<br />

Consideremos cómo se ejecuta la función Fac aplicada a un <strong>en</strong>tero, por ejemplo<br />

el 3:<br />

Fac(3) = 3 ∗ Fac(2) = 3 ∗ 2 ∗ Fac(1)<br />

= 3 ∗ 2 ∗ 1 ∗ Fac(0) = 3 ∗ 2 ∗ 1 ∗ 1 = 3!<br />

El primer bucle de los com<strong>en</strong>tados más arriba consistiría <strong>en</strong> ir apilando los<br />

argum<strong>en</strong>tos sucesivos de Fac hasta llegar al caso base, <strong>en</strong> este ejemplo t<strong>en</strong>emos<br />

3, 2, 1; el segundo bucle es el <strong>en</strong>cargado de completar las llamadas recursivas<br />

usando la parte recursiva de Fac, esto es, se parte del caso base Fac(0) = 1 y se<br />

van multiplicando los distintos valores apilados. At<strong>en</strong>di<strong>en</strong>do a esta descripción,<br />

un primer nivel de diseño para la versión iterativa del factorial podría ser el<br />

sigui<strong>en</strong>te:<br />

para cada n <strong>en</strong>tre num y 1<br />

Apilar n <strong>en</strong> pilaRec<br />

Dar valor inicial 1 a fac<br />

mi<strong>en</strong>tras que pilaRec no esté vacía hacer<br />

fac:= Cima(pilaRec) * fac<br />

SuprimirDePila(pilaRec)<br />

Devolver fac<br />

La implem<strong>en</strong>tación iterativa <strong>en</strong> <strong>Pascal</strong> de la función factorial se ofrece a<br />

continuación:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!