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.

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

Supongamos ahora que para n − 1, es decir, para E = {x1, x2, . . . , xn−1} se<br />

cumple que N = 2 n−1 y veamos si se puede demostrar que para n también se<br />

ti<strong>en</strong>e que N = 2 n .<br />

Distribuyamos las partes de E = {x1, x2, . . . , xn} <strong>en</strong> dos clases: una con las<br />

que no conti<strong>en</strong><strong>en</strong> al elem<strong>en</strong>to xn, y otra con las que sí lo conti<strong>en</strong><strong>en</strong>. La hipótesis<br />

de inducción expresa que la primera está constituida por 2 n−1 subconjuntos,<br />

mi<strong>en</strong>tras que los subconjuntos de la segunda son los que resultan de la unión de<br />

{xn} con cada uno de los subconjuntos de la primera clase. Por tanto, el número<br />

total de subconjuntos es N = 2 n−1 + 2 n−1 = 2 n .<br />

En consecu<strong>en</strong>cia, aplicando el principio de inducción se puede afirmar que<br />

para todo n ∈ IN se cumple que P(E) ti<strong>en</strong>e 2 n elem<strong>en</strong>tos.<br />

Aunque esta formalización del Principio de Inducción es sufici<strong>en</strong>te para un<br />

gran número de casos, <strong>en</strong> otros se puede requerir otra <strong>en</strong> la que tomamos como<br />

hipótesis la verificación de la propiedad por todos los elem<strong>en</strong>tos m<strong>en</strong>ores que x:<br />

Es decir,<br />

• Si para cualquier x ∈ IN se ti<strong>en</strong>e que, si todo y < x ti<strong>en</strong>e la propiedad P ,<br />

<strong>en</strong>tonces x también ti<strong>en</strong>e la propiedad P<br />

• <strong>en</strong>tonces todo z ∈ IN ti<strong>en</strong>e la propiedad P<br />

Disponemos ya de la herrami<strong>en</strong>ta necesaria para retomar la verificación de<br />

nuestro subprograma recursivo. Recordemos que nos <strong>en</strong>contrábamos con el problema<br />

de comprobar la corrección de una llamada al propio subprograma que<br />

estamos verificando, lo cual nos hace <strong>en</strong>trar, apar<strong>en</strong>tem<strong>en</strong>te, <strong>en</strong> un ciclo sin fin.<br />

La clave para salir de este ciclo es darnos cu<strong>en</strong>ta de que, si la recursión está bi<strong>en</strong><br />

definida, la llamada que int<strong>en</strong>tamos verificar ti<strong>en</strong>e como parámetro de llamada<br />

un valor m<strong>en</strong>or (o, <strong>en</strong> otras palabras, más cercano al caso base de la recursión).<br />

Por ejemplo, <strong>en</strong> el caso de la función factorial, la estructura de selección que<br />

controla la recursión es:<br />

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

Fac:= 1<br />

else<br />

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

En este punto es donde <strong>en</strong>tra <strong>en</strong> juego el Principio de Inducción, ya que,<br />

basándonos <strong>en</strong> él, si<br />

1. el subprograma es correcto <strong>en</strong> el caso base (<strong>en</strong> nuestro caso es obvio que<br />

Fac(0) = 1 = 0!), y

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

Saved successfully!

Ooh no, something went wrong!