unidad 3. estructuras no lineales

16
Unidad 3. Estructuras no lineales 3.1. Recursividad

Upload: others

Post on 02-Aug-2022

21 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Unidad 3. Estructuras no lineales

Unidad 3. Estructuras no lineales

3.1. Recursividad

Page 2: Unidad 3. Estructuras no lineales

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

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

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

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

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

• 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

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

• 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

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

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

• 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

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

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

• 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

Referencia

• Beltrán, B. (2015). Facultad de Ciencias de la Computación,BUAP. Notas de clase.