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.

10.4. Corrección de subprogramas recursivos 219<br />

10.3.3 Función de Ackermann<br />

Otro interesante ejemplo recursivo es la función de Ackermann que se define<br />

recurr<strong>en</strong>tem<strong>en</strong>te así:<br />

Ack(0, n) = n + 1<br />

Ack(m, 0) = Ack(m − 1, 1), si m > 0<br />

Ack(m, n) = Ack(m − 1, Ack(m, n − 1)) si m, n > 0<br />

La función correspondi<strong>en</strong>te <strong>en</strong> <strong>Pascal</strong> se escribe así:<br />

function Ack(m, n: integer): integer;<br />

{PreC.: m,n ≥ 0}<br />

{Dev. Ack(m, n)}<br />

begin<br />

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

Ack:= n + 1<br />

else if n = 0 th<strong>en</strong><br />

Ack:= Ack(m - 1, 1)<br />

else<br />

Ack:= Ack(m - 1, Ack(m, n - 1))<br />

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

10.4 Corrección de subprogramas recursivos<br />

En este apartado pres<strong>en</strong>taremos los conceptos y técnicas necesarias para la<br />

verificación (o derivación) de subprogramas recursivos.<br />

En este s<strong>en</strong>tido, la pauta vi<strong>en</strong>e dada por la consideración de que un subprograma<br />

recursivo no es más que un caso particular de subprograma <strong>en</strong> el que<br />

aparec<strong>en</strong> llamadas a sí mismo. Esta peculiaridad hace que t<strong>en</strong>gamos que recurrir<br />

a alguna herrami<strong>en</strong>ta matemática, de aplicación no demasiado complicada <strong>en</strong> la<br />

mayoría de los casos, que <strong>en</strong>contraremos <strong>en</strong> este libro.<br />

El proceso de análisis de la corrección de subprogramas recursivos puede ser<br />

dividido, a nuestro <strong>en</strong>t<strong>en</strong>der, <strong>en</strong> dos partes: una primera, <strong>en</strong> la que consideraremos<br />

los pasos de la verificación comunes con los subprogramas no recursivos, y<br />

una segunda con los pasos <strong>en</strong> los que se aplican técnicas específicas de verificación<br />

de la recursión.<br />

De acuerdo con esta división, incluiremos <strong>en</strong> primer lugar, y tal como se ha<br />

hecho hasta ahora, las precondiciones y postcondiciones de cada subprograma<br />

que, junto con el <strong>en</strong>cabezami<strong>en</strong>to, formarán su especificación (semi-formal). Recordemos<br />

que las precondiciones y postcondiciones actúan como g<strong>en</strong>eralizaciones<br />

de las precondiciones y postcondiciones, respectivam<strong>en</strong>te, de las instrucciones<br />

simples, explicitando los requisitos y los efectos del subprograma.

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

Saved successfully!

Ooh no, something went wrong!