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.

222 Capítulo 10. Introducción a la recursión<br />

2. demostramos que la construcción del paso recursivo es correcta, suponi<strong>en</strong>do<br />

que lo es la llamada al subprograma para valores m<strong>en</strong>ores del parámetro<br />

sobre el que se hace la recursión. En este caso t<strong>en</strong>emos asegurada la corrección<br />

de nuestro subprograma para cualquier valor del parámetro de<br />

<strong>en</strong>trada.<br />

En el ejemplo, basta con demostrar que, si suponemos que<br />

<strong>en</strong>tonces<br />

Fac(num −1) = (num − 1)!<br />

Fac(num) = num ∗Fac(num −1)<br />

= num ∗ (num − 1)!<br />

= num!<br />

En resum<strong>en</strong>, para demostrar la corrección de un subprograma recursivo hemos<br />

de comprobar:<br />

• La corrección del caso base.<br />

• La corrección de los casos recurr<strong>en</strong>tes. Para ello, se supone la de las llamadas<br />

subsidiarias, como ocurre <strong>en</strong> el paso inductivo con la hipótesis de<br />

inducción.<br />

• Que las llamadas recursivas se hac<strong>en</strong> de manera que los parámetros se<br />

acercan al caso base; por ejemplo, <strong>en</strong> el cálculo del factorial, <strong>en</strong> las sucesivas<br />

llamadas los parámetros son n, n − 1, . . ., que desembocan <strong>en</strong> el caso base<br />

0, siempre que n > 0, lo cual se exige <strong>en</strong> la condición previa de la función.<br />

10.5 Recursión mutua<br />

Cuando un subprograma llama a otro y éste a su vez al primero, se produce<br />

lo que se d<strong>en</strong>omina recursión mutua o cruzada, que consiste <strong>en</strong> que un subprograma<br />

provoque una llamada a sí mismo, indirectam<strong>en</strong>te, a través de otro u otros<br />

subprogramas.<br />

En estos casos, se pres<strong>en</strong>ta un problema para definir los subprogramas, porque<br />

uno de ellos t<strong>en</strong>drá que ser definido antes del otro, y la llamada que haga<br />

al segundo se hace a un id<strong>en</strong>tificador desconocido, contravini<strong>en</strong>do la norma de<br />

<strong>Pascal</strong> por la que un id<strong>en</strong>tificador ti<strong>en</strong>e que ser declarado antes de usarlo.<br />

No obstante, el mismo l<strong>en</strong>guaje nos da la solución mediante el uso de la palabra<br />

reservada forward. Con su uso, el id<strong>en</strong>tificador del subprograma definido

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

Saved successfully!

Ooh no, something went wrong!