15.02.2014 Views

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

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 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

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

Saved successfully!

Ooh no, something went wrong!