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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

function F(x: tdato): tResultado;<br />

begin<br />

if P(x) th<strong>en</strong><br />

F:= Q(x)<br />

else<br />

F:= E(x, F(T(x)))<br />

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

donde P(x) es una expresión booleana para determinar el caso base (<strong>en</strong> el factorial<br />

es x = 0, Q(x) es el valor de la función <strong>en</strong> el caso base, T es una función que<br />

transforma el argum<strong>en</strong>to x <strong>en</strong> el de la sigui<strong>en</strong>te llamada (<strong>en</strong> el factorial es T(x)<br />

= x - 1), y, finalm<strong>en</strong>te, E(x, y) es la expresión que combina el argum<strong>en</strong>to x<br />

con el resultado y devuelto por la llamada recursiva subsigui<strong>en</strong>te (<strong>en</strong> el factorial<br />

se ti<strong>en</strong>e E(x, y) = x * y).<br />

En resum<strong>en</strong>, cualquier función de la forma de la función F puede ser descrita<br />

mediante un par de bucles de forma que:<br />

1. El primero almac<strong>en</strong>a los parámetros de las sucesivas llamadas recursivas al<br />

aplicar la función T hasta llegar al caso base.<br />

2. El segundo deshace la recursión aplicando la expresión E(x, F(T(x)) repetidam<strong>en</strong>te<br />

desde el caso base hasta el argum<strong>en</strong>to inicial.<br />

La descripción g<strong>en</strong>eral de estos dos bucles se muestra a continuación:<br />

function F(x: tDato): tResultado;<br />

var<br />

pilaRec: tPila;<br />

acum: tDato;<br />

begin<br />

CrearPila(pilaRec);<br />

{Primer bucle}<br />

while not P(x) do begin<br />

Apilar(x, pilaRec);<br />

x:= T(x)<br />

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

acum:= Q(x); {Aplicación de F al caso base}<br />

{Segundo bucle}<br />

while pilaRec nil do begin<br />

acum:= E(Cima(pilaRec), acum);<br />

SuprimirDePila(pilaRec)<br />

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

F:= acum<br />

<strong>en</strong>d; {F}

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

Saved successfully!

Ooh no, something went wrong!