Cap. 3 Administración de la memoria en C. - Inicio
Cap. 3 Administración de la memoria en C. - Inicio
Cap. 3 Administración de la memoria en C. - Inicio
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
10 Estructuras <strong>de</strong> Datos y Algoritmos<br />
En un procedimi<strong>en</strong>to iterativo, también <strong>de</strong>nominado bottom-up, se parte <strong>de</strong> <strong>la</strong> base conocida y<br />
se construye <strong>la</strong> solución paso a paso, hasta llegar al caso final.<br />
Más a<strong>de</strong><strong>la</strong>nte veremos una estructura básica <strong>de</strong> datos, <strong>de</strong>nominada stack <strong>de</strong> usuario (no<br />
confundir con el stack que maneja <strong>la</strong>s variables automáticas). Se pue<strong>de</strong> <strong>de</strong>mostrar que un<br />
algoritmo recursivo siempre se pue<strong>de</strong> p<strong>la</strong>ntear <strong>en</strong> forma iterativa con <strong>la</strong> ayuda <strong>de</strong>l stack <strong>de</strong><br />
usuario. Y un programa iterativo, que requiera <strong>de</strong> un stack <strong>de</strong> usuario, se pue<strong>de</strong> p<strong>la</strong>ntear <strong>en</strong><br />
forma recursiva (sin stack).<br />
Si existe una forma recursiva <strong>de</strong> resolver un problema, <strong>en</strong>tonces existe también una forma<br />
iterativa <strong>de</strong> hacerlo; y viceversa.<br />
Consi<strong>de</strong>remos <strong>la</strong> función matemática factorial, que tradicionalm<strong>en</strong>te está <strong>de</strong>finida <strong>en</strong> forma<br />
recursiva (a través <strong>de</strong> sí misma).<br />
factorial( 0 ) = 1<br />
factorial( n ) = n * factorial( n-1 )<br />
La condición para <strong>de</strong>t<strong>en</strong>er <strong>la</strong> recursión, el caso base, es que factorial <strong>de</strong> cero es uno. También se<br />
pue<strong>de</strong> <strong>de</strong>t<strong>en</strong>er con factorial(1) = 1.<br />
Ejemplo 3.5. Diseño recursivo.<br />
El sigui<strong>en</strong>te diseño recursivo, condiciona <strong>la</strong> re-invocación <strong>de</strong> <strong>la</strong> función cuando se llega al caso<br />
base:<br />
unsigned int factorial( unsigned int n)<br />
{<br />
if ( n==0) return (1);<br />
else return n*factorial(n-1);<br />
}<br />
El diseño está restringido a valores <strong>de</strong> n positivos y pequeños; ya que existe un máximo <strong>en</strong>tero<br />
repres<strong>en</strong>table, y <strong>la</strong> función factorial crece rápidam<strong>en</strong>te.<br />
Si se invoca: factorial(4), se produc<strong>en</strong> cinco frames <strong>en</strong> el stack.<br />
El último frame es producido por <strong>la</strong> invocación <strong>de</strong> factorial(0), hasta ese mom<strong>en</strong>to ninguna <strong>de</strong><br />
<strong>la</strong>s funciones ha retornado (todas están ejecutando <strong>la</strong> acción asociada al else, pero no pue<strong>de</strong>n<br />
retornar ya que requier<strong>en</strong> para calcu<strong>la</strong>r el producto, el valor <strong>de</strong> retorno <strong>de</strong> <strong>la</strong> función).<br />
Exist<strong>en</strong> cinco argum<strong>en</strong>tos, <strong>de</strong> nombre n, con valores difer<strong>en</strong>tes. La ejecución, <strong>de</strong>l caso base<br />
(n=0), no invoca nuevam<strong>en</strong>te a <strong>la</strong> función, ya que ésta está condicionada, y retorna el valor 1; lo<br />
cual <strong>de</strong>sactiva el frame con n=0, y pasa a completar <strong>la</strong> ejecución <strong>de</strong>l l<strong>la</strong>mado factorial(1) que<br />
estaba p<strong>en</strong>di<strong>en</strong>te. En este mom<strong>en</strong>to: conoce n, que es uno, y el valor retornado por factorial(0),<br />
que también es uno; <strong>en</strong>tonces retorna 1, y elimina el frame.<br />
Sigue <strong>la</strong> ejecución <strong>de</strong> factorial(2) <strong>de</strong>l mismo modo, hasta eliminar el último frame, retornando el<br />
valor 24.<br />
Profesor Leopoldo Silva Bijit 20-01-2010