Download - Unidad 3. Estructuras no lineales
![Page 1: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/1.jpg)
Unidad 3. Estructuras no lineales
3.1. Recursividad
![Page 2: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/2.jpg)
Introducción
• Una función recursiva es aquella que se llama a símisma.
• La recursividad es una alternativa a la repetición oiteración.
• En tiempo de computadora y ocupación de memoria,la solución recursiva es menos eficiente que laiterativa, existen situaciones en las que larecursividad es una solución simple y natural a unproblema que en otro caso será difícil de resolver
![Page 3: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/3.jpg)
Definición de un método recursivo
• La característica principal de la recursividad es quesiempre existe un medio de salir de la definición (casobase o salida), y la segunda condición (llamadorecursivo) es propiamente donde se llama a sí misma.
• Una función recursiva simple en Java es:
public void infinito ()
{
infinito ();
}
![Page 4: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/4.jpg)
Definición
• De manera más formal, una función recursiva esinvocada para solucionar un problema y dicha funciónsabe cómo resolver los casos más sencillo (casos bases).
• Donde si la función es llamada desde un caso base, éstasimplemente devuelve el resultado.
• Si es llamada mediante un problema más complejo, lafunción lo divide en dos partes conceptuales: una partede dicha función sabe resolver y otra que no saberesolver.
![Page 5: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/5.jpg)
Definición
• Además esta segunda parte debe parecerse al problemaen sí; para tener la recursividad; pero debe ser mássimple.
• Debido a que se parece a la original la función lanza unacopia de ella misma, que se encargará del problema mássencillo (llamado recursivo o paso de recursión).
• En esta parte se tendrá la devolución de un valor que eradesconocido inicialmente.
![Page 6: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/6.jpg)
Ejemplo con recursividad
• El factorial de un entero no negativo n, esta definidocomo:
n! = n * (n-1) * (n-2) * … *2 *1
• Donde 1! es igual a 1 y 0! se define como 1.
• El factorial de un entero k puede calcularse de maneraiterativa como sigue:
fact = 1;
for (int i = k; i>=1; i--)
fact *= i;
![Page 7: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/7.jpg)
• Ahora de manera recursiva se puede definir el factorialcomo:
Donde el caso base es: 1 Si n = 0.
El caso general es: n * (n-1)! Si n > 0.
• Por ejemplo si se quiere calcular el factorial de 5, setendría:
5! = 5*4*3*2*1
5! = 5*(4*3*2*1)
5! = 5*4!
0 si )!1(*
0 si 1!
nnn
nn
Ejemplo con recursividad
![Page 8: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/8.jpg)
Ejemplo con recursividad
5!
5* 4!
4* 3!
3* 2!
2* 1!
1
5!
5* 4!
4* 3!
3* 2!
2* 1!
1
Se devuelve 1
Se devuelve 2!=2*1=2
Se devuelve 3!=3*2=6
Se devuelve 4!=4*6=24
Se devuelve 5!=5*24=120
Valor devuelto 120
![Page 9: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/9.jpg)
• Caso base: Es el caso más simple de una funciónrecursiva, y simplemente devuelve un resultado (el casobase se puede considerar como una salida no recursiva).
• Caso general: Relaciona el resultado del algoritmo conresultados de casos más simples. Dado que cada caso deproblema aparenta o se ve similar al problema original, lafunción llama una copia nueva de si misma, para queempiece a trabajar sobre el problema más pequeño yesto se conoce como una llamada recursiva y también sellama el paso de recursión.
Ejemplo con recursividad
![Page 10: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/10.jpg)
1. Obtener una definición exacta del problema a resolver.(Esto, por supuesto, es el primer paso en la resoluciónde cualquier problema de programación).
2. A continuación, determinar el tamaño del problemacompleto que hay que resolver. Este tamañodeterminará los valores de los parámetros en lallamada inicial a la función.
3. Resolver el caso base en el que el problema puedeexpresarse no recursivamente. Por último, resolver elcaso general correctamente en términos de un casomás pequeño del mismo problema, una llamadarecursiva.
Método
![Page 11: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/11.jpg)
Tipos de recursión
• Recursividad simple: Aquella en cuya definición sóloaparece una llamada recursiva. Se puede transformarcon facilidad en algoritmos iterativos.
• Factorial
• Recursividad múltiple: Se da cuando hay más de unallamada a sí misma dentro del cuerpo de la función,resultando más difícil de hacer de forma iterativa.
• Fibonacci
![Page 12: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/12.jpg)
• Recursividad anidada: En algunos de los argumentos dela llamada recursiva hay una nueva llamada a sí misma.
• Ackerman
• Recursividad cruzada o indirecta: Son algoritmos dondeuna función provoca una llamada a sí misma de formaindirecta, a través de otras funciones. Es decir es aquellaen la que una función es llamada a otra función y esta asu vez llama a la función que la llamó.
Tipos de recursión
![Page 13: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/13.jpg)
Ejemplo: Par o Impar
int par(int nump) {
if (nump==0)
return(1);
return( impar(nump-1)); }
int impar (int numi) {
if(numi==0)
return(0);
return( par(numi-1)); }
Tipos de recursión
![Page 14: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/14.jpg)
Recursión vs. Iteración
• Las principales cuestiones son la claridad y la eficienciade la solución.
• En general: Una solución no recursiva es más eficienteen términos de tiempo y espacio de computadora.
• La solución recursiva puede requerir gastosconsiderables, y deben guardarse copias de variableslocales y temporales.
• Aunque el gasto de una llamada a una funciónrecursiva no es peor, esta llamada original puedeocultar muchas capas de llamadas recursivas internas.
• El sistema puede no tener suficiente espacio paraejecutar una solución recursiva de algunos problemas.
![Page 15: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/15.jpg)
• Una solución recursiva particular puede tener unaineficiencia inherente. Tal ineficiencia no es debida ala elección de la implementación del algoritmo; másbien, es un defecto del algoritmo en si mismo.
• Un problema inherente es que algunos valores soncalculados una y otra vez causando que la capacidadde la computadora se exceda antes de obtener unarespuesta.
• La cuestión de la claridad en la solución es, noobstante, un factor importante.
• En algunos casos una solución recursiva es más simpley más natural de escribir.
Recursión vs. Iteración
![Page 16: Unidad 3. Estructuras no lineales](https://reader035.vdocuments.pub/reader035/viewer/2022080219/62e8543f841c8c028941f4ba/html5/thumbnails/16.jpg)
Referencia
• Beltrán, B. (2015). Facultad de Ciencias de la Computación,BUAP. Notas de clase.