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.

458 Capítulo 20. Esquemas algorítmicos fundam<strong>en</strong>tales<br />

Sin embargo, se observa que un bu<strong>en</strong> número de tramos se calcula repetidam<strong>en</strong>te<br />

(ab, ac, ad, . . . ), por lo que se puede mejorar el planteami<strong>en</strong>to evitando<br />

los cálculos idénticos reiterados, concretam<strong>en</strong>te mediante las técnicas de tabulación.<br />

En este apartado estudiaremos <strong>en</strong> primer lugar <strong>en</strong> qué consist<strong>en</strong> esas técnicas,<br />

y después retomaremos el algoritmo anterior para ver cómo puede mejorarse su<br />

comportami<strong>en</strong>to mediante la tabulación.<br />

Tabulación de subprogramas recursivos<br />

En ocasiones, una función f con varias llamadas recursivas g<strong>en</strong>era, por difer<strong>en</strong>tes<br />

vías, llamadas repetidas. La función de Fibonacci (véase el apartado 10.3.1)<br />

es un ejemplo clásico:<br />

5<br />

4<br />

3<br />

3<br />

2<br />

2 1<br />

2 1 1 0 1 0<br />

✠<br />

1 0<br />

❅ ✠<br />

❅❘<br />

❅ ✘✘✘<br />

❳❳<br />

✘✘<br />

❳❳<br />

✘<br />

❳❳<br />

✘✾<br />

❳③<br />

✏✏<br />

<br />

✏✮ ✏ <br />

✏✏<br />

<br />

✏✮ ✏ <br />

✟<br />

✟✙ ✟ ◗<br />

◗◗<br />

❅❘ ✠ ❅❅❘ Al aplicarse al argum<strong>en</strong>to 5, la llamada Fib(1) se dispara cinco veces.<br />

Una solución para evitar la evaluación repetida consiste <strong>en</strong> dotar a la función<br />

de memoria de modo que recuerde los valores para los que se ha calculado junto<br />

con los resultados producidos. Así, cada cálculo requerido de la función se consultará<br />

<strong>en</strong> la tabla, extray<strong>en</strong>do el resultado correspondi<strong>en</strong>te si ya se hubiera<br />

efectuado o registrándolo <strong>en</strong> ella si fuera nuevo.<br />

El esquema es bi<strong>en</strong> s<strong>en</strong>cillo: basta con establecer una tabla (la memoria de<br />

la función) global e incluir <strong>en</strong> ella las consultas y actualizaciones m<strong>en</strong>cionadas:<br />

function f’(x: datos; var T: tablaGlobal): resultados;<br />

begin<br />

if x no está <strong>en</strong> la tabla T th<strong>en</strong> begin<br />

Hallar las llamadas recursivas f’(xi, T) y combinarlas, hallando<br />

el valor f’(x, T) requerido<br />

Incluir <strong>en</strong> la tabla T el argum<strong>en</strong>to x y el resultado f’(x, T) obt<strong>en</strong>ido<br />

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

f’:= T[x]<br />

<strong>en</strong>d; {f’}<br />

Por ejemplo, la función de Fibonacci definida antes puede tabularse como<br />

sigue. En primer lugar, definimos la tabla:

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

Saved successfully!

Ooh no, something went wrong!