Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Luis Hernandez
Luis Hernandez
Recursividad
RECURSIVIDAD
El -rea de la pro'ramaci&n es mu% amplia % con muc.os detalles/ Los pro'ramadores necesitan ser capaces de resolver todos los problemas *ue se les presente a trav s del computador aun cuando en el len'ua0e *ue utilizan no .a%a una manera directa de resolver los problemas/ En el len'ua0e de pro'ramaci&n 12 as3 como en otros len'ua0es de pro'ramaci&n2 se puede aplicar una t cnica *ue se le dio el nombre de recursividad por su funcionalidad/ Esta t cnica es utilizada en la pro'ramaci&n estructurada para resolver problemas *ue ten'an *ue ver con el factorial de un nmero2 o 0ue'os de l&'ica/ Las asi'naciones de memoria pueden ser din-micas o est-ticas % .a% diferencias entre estas dos % se pueden aplicar las dos en un pro'rama cual*uiera/
La recursi&n es un concepto amplio2 dif3cil de precisar/ "parece en numerosas actividades de la vida diaria2 por e0emplo2 en una foto'raf3a de una foto'raf3a/ 4tro caso mu% ilustrativo de recursi&n es el *ue se presenta en los pro'ramas de televisi&n en los cuales un periodista transfiere el control a otro periodista *ue se encuentra en otra ciudad2 % ste .ace lo propio con un tercero/ "*u3 nos limitaremos a estudiar la recursividad desde el punto de vista de pro'ramaci&n/ La recursi&n permite definir un ob0eto 5problemas2 estructuras de datos6 en t rminos de s3 mismo/ 1asos t3picos de estructuras de datos definidas de manera recursiva son los -rboles % las listas li'adas/ "l'unos e0emplos de problemas *ue se definen recursivamente son el factorial de un nmero2 la serie de !ibonacci2 etc/
)e entiende *ue puede parecer un proceso infinito2 pero la clave est- en *ue en cada llamada el problema se 7simplifica8 de tal modo *ue lle'ar- el momento en *ue no .ar- falta llamar nuevamente al m todo recursivo/ 7Recordemos *ue la rama tiene ramas2 *ue a su vez tiene rama pero lle'a el momento en *ue se lle'a a una rama *ue solo tiene .o0as/8
1abe resaltar *ue la recursividad es una .erramienta mu% importante en la pro'ramaci&n *ue en muc.os casos permite expresar al'oritmos de forma simple % le'ible/
9odos los problemas candidatos a ser implementados por medio de la recursividad deben tener : caracter3sticas fundamentales(
)e refiere a la capacidad *ue tienen al'unos procesos de dividirse en subprocesos2 en donde cada parte e0ecutara un proceso base .eredado del proceso principal/ 1abe destacar *ue cada parte deber- contener la misma
estructura funcional2 es decir2 no puede existir subprocesos *ue ten'an funciones o atributos diferentes al resto/
1omo %a se entiende los al'oritmos no podr-n efectuarse infinitamente en nuestro procesador o decidir por s3 solo cuando detenerse/ Debemos determinar cuales deber-n ser las condiciones de partida de nuestro al'oritmo % cuando este deber- detenerse % mostrar al'n resultado 5nos referiremos a estos puntos como 7condiciones de partidas8 % 7caso base8 respectivamente en lo *ue resta del art3culo6/ "l iniciar esta tarea podr3a ser una de las m-s complicadas de la recursividad2 pero con un poco de pr-ctica podr-s identificar ambos puntos f-cilmente/En muc.os casos 5siempre % cuando sea posible6 ser- de 'ran a%uda contar con un bos*ue0o de la soluci&n de nuestro problema de manera iterativa/ Esto nos brindara un punto de partida al momento de dividir nuestro problema e identificar las condiciones de partidas % el caso base
RECURSIN INDIRECTA
Un pro'rama llama a otro subpro'rama % este a su vez al primero El subpro'rama " llama al B % este a su vez llama al primero "2 es decir *ue lue'o de tantas llamadas el control re'resa al subpro'rama "/ 4tro caso de recursi&n ndirecta es el caso b6 de la fi'ura2 *ue muestra como un subpro'rama llama a otro % este a un tercero % una vez e0ecutado el subpro'rama vuelve a donde fue llamado/ En el 0emplo de la fi'ura el pro'rama " llama al B % este al 1A cuando finaliza la e0ecuci&n 1 vuelve a donde fue llamado B % este a su vez al subpro'rama " # pro'rama inicio
RECURSIN MUTUA
1uando un subpro'rama llama a otro % ste a su vez al primero2 se
subpro'rama provo*ue una llamada a s3 mismo2 indirectamente2 a trav s de otro u otros subpro'ramas/ En estos casos2 se presenta un problema para definir los subpro'ramas2 por*ue uno de ellos tendr- *ue ser definido antes del otro2 % la llamada *ue .a'a al se'undo se .ace a un identificador desconocido2 contraviniendo la norma de Pascal por la *ue un identificador tiene *ue ser declarado antes de usarlo/
VENTAJAS Y DESVENTAJAS
Ventajas )oluciones simples2 claras )oluciones ele'antes/ )oluciones a problemas comple0os/
Desventajas )obrecar'a asociada con las llamadas a subal'oritmos Una simple llamada puede 'enerar un 'ran numero de llamadas recursivas/ La ineficiencia in.erente de al'unos al'oritmos recursivos/
termina nunca2 lle'a un momento en el *ue no *uedar- memoria para almacenar m-s datos2 % en ese momento se abortar- la e0ecuci&n del pro'rama
Ejercicio 1
Dinclude Estdio/.F void introduccion56G printf5HEl )i'uiente Pro'rama 1alcula el !actorial de un Numero///InInH6AJ int datos56G int numA printf5H+n'rese un numero entero( InH6A scanf5HKuH2 Lnum6A printf5HInH6A return5num6AJ lon' int factorial5int num6G
lon' int factM<A if5numFN6G factMnumOfactorial5num=<6AJ PPuso de la recursividad return5fact6AJ void imprimir5int num2lon' int fact6G if5numEN6 printf5HEl !actorial de un Numero Ne'ativo No ExisteInInH6A else if5numMMN6 printf5HEl !actorial de Kld es( <InInH2num6A else printf5HEl !actorial de Kd es( KldInInH2 num2 fact6A printf5HPresione una 9ecla para )alir///H6AJ main56G int numA lon' int factA introduccion56A numMdatos56A factMfactorial5num6A imprimir5num2 fact6A 'etc.e56A returnA J
Ejercicio 2
Dinclude Eiostream/.F Dinclude Estdlib/.F Dinclude Estdio/.F POModulo Para la +ntroduccionOP void introd56G
printf5H(((((((((((((((((((((((((((((((((((((((((((((((((((((InH6A printf5HItItIt+N9R4DU11+4NInH6A printf5HItEl )i'uiente Pro'rama 9iene 1omo !uncionInH6A printf5HItLeer Un Numero Entero E imprimir su valor enInH6A printf5HItItIt"steriscosInH6A printf5H(((((((((((((((((((((((((((((((((((((((((((((((((((((InH6A J POModulo Para la +mpresion usando recursividadOP void ast5int num6G if5numFM<6G printf5HIt OH6A ast5num=<6A PPuso de la recursividad printf5HInH6A JJ POLlamado a las !uncionesOP main56 G int numA introd56A printf5HInH6A POEntrada de datosOP doG printf5H+n'rese Un Numero EnteroInH6A scanf5HKdH2Lnum6A printf5HInH6A JQ.ile5numEN6A ast5num6A printf5HInInH6A s%stem5HP"U)EH6A return NA J
Ejercicio 3
Dinclude Estdio/.F int mcd5int2int6A int main5void6G int n<2n:A printf5H+n'rese el primer numero( H6A scanf5HKdH2Ln<6A printf5H+n'rese el se'undo numero( H6A scanf5HKdH2Ln:6A printf5HEl maximo comun divisor es( KdH2mcd5n<2n:66A 'etc.ar56A return NAJ int mcd5int a2int b6G if5bMMN6 return aA else return mcd5b2aKb6AJ