15
Recursión MC Beatriz Beltrán Martínez Primavera 2014

Recursión MC Beatriz Beltrán Martínez Primavera 2014

Embed Size (px)

Citation preview

Page 1: Recursión MC Beatriz Beltrán Martínez Primavera 2014

RecursiónMC Beatriz Beltrán Martínez

Primavera 2014

Page 2: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Introducción

• Una función recursiva es aquella que se llama a sí misma.

• La recursividad es una alternativa a la repetición o iteración.• En tiempo de computadora y ocupación de memoria,

la solución recursiva es menos eficiente que la iterativa, existen situaciones en las que la recursividad es una solución simple y natural a un problema que en otro caso será difícil de resolver

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

2

Page 3: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Definición de un método recursivo• La característica principal de la recursividad es que

siempre existe un medio de salir de la definición (caso base o salida), y la segunda condición (llamado recursivo) es propiamente donde se llama a sí misma.

• Una función recursiva simple en Java es: public void infinito () { infinito (); }

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

3

Page 4: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Definición

•De manera más formal, una función recursiva es invocada para solucionar un problema y dicha función sabe cómo resolver los casos más sencillo (casos bases).•Donde si la función es llamada desde un caso base, ésta simplemente devuelve el resultado.•Si es llamada mediante un problema más complejo, la función lo divide en dos partes conceptuales: una parte de dicha función sabe resolver y otra que no sabe resolver.

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

4

Page 5: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Definición

•Además esta segunda parte debe parecerse al problema en sí; para tener la recursividad; pero debe ser más simple.•Debido a que se parece a la original la función lanza una copia de ella misma, que se encargará del problema más sencillo (llamado recursivo o paso de recursión).•En esta parte se tendrá la devolución de un valor que era desconocido inicialmente.

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

5

Page 6: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Ejemplo con recursividad

• El factorial de un entero no negativo n, esta definido como:

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 manera

iterativa como sigue:fact = 1;

for (int i = k; i>=1; i--) fact *= i;

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

6

Page 7: Recursión MC Beatriz Beltrán Martínez Primavera 2014

• Ahora de manera recursiva se puede definir el factorial como:

Donde el caso base es: 1 Si n = 0, n=1.El caso general es: n * (n-1)! Si n > 1.

• Por ejemplo si se quiere calcular el factorial de 5, se tendría:

5! = 5*4*3*2*15! = 5*(4*3*2*1)5! = 5*4!

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

7

1 si )!1(*

1,0 si 1!

nnn

nnn

Ejemplo con recursividad

Page 8: Recursión MC Beatriz Beltrán Martínez Primavera 2014

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

8

Ejemplo con recursividad

5!

5* 4!

4* 3!

3* 2!

2* 1!

1

5!

5* 4!

4* 3!

3* 2!

2* 1!

1Se 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: Recursión MC Beatriz Beltrán Martínez Primavera 2014

• Caso base: Es el caso más simple de una función recursiva, y simplemente devuelve un resultado (el caso base se puede considerar como una salida no recursiva).

• Caso general: Relaciona el resultado del algoritmo con resultados de casos más simples. Dado que cada caso de problema aparenta o se ve similar al problema original, la función llama una copia nueva de si misma, para que empiece a trabajar sobre el problema más pequeño y esto se conoce como una llamada recursiva y también se llama el paso de recursión.

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

9

Ejemplo con recursividad

Page 10: Recursión MC Beatriz Beltrán Martínez Primavera 2014

1. Obtener una definición exacta del problema a resolver. (Esto, por supuesto, es el primer paso en la resolución de cualquier problema de programación).

2. A continuación, determinar el tamaño del problema completo que hay que resolver. Este tamaño determinará los valores de los parámetros en la llamada inicial a la función.

3. Resolver el caso base en el que el problema puede expresarse no recursivamente. Por último, resolver el caso general correctamente en términos de un caso más pequeño del mismo problema, una llamada recursiva.

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

10

Método

Page 11: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Tipos de recursión

• Recursividad simple: Aquella en cuya definición sólo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos.

• Factorial

• Recursividad múltiple: Se da cuando hay más de una llamada a sí misma dentro del cuerpo de la función, resultando más difícil de hacer de forma iterativa.

• Fibonacci

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

11

Page 12: Recursión MC Beatriz Beltrán Martínez Primavera 2014

• Recursividad anidada: En algunos de los argumentos de la llamada recursiva hay una nueva llamada a sí misma.

• Ackerman

• Recursividad cruzada o indirecta: Son algoritmos donde una función provoca una llamada a sí misma de forma indirecta, a través de otras funciones. Es decir es aquella en la que una función es llamada a otra función y esta a su vez llama a la función que la llamó.

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

12

Tipos de recursión

Page 13: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Ejemplo: Par o Imparint 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)); }

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

13

Tipos de recursión

Page 14: Recursión MC Beatriz Beltrán Martínez Primavera 2014

Recursión vs. Iteración

• Las principales cuestiones son la claridad y la eficiencia de la solución.• En general: Una solución no recursiva es más eficiente

en términos de tiempo y espacio de computadora.• La solución recursiva puede requerir gastos

considerables, y deben guardarse copias de variables locales y temporales.

• Aunque el gasto de una llamada a una función recursiva no es peor, esta llamada original puede ocultar muchas capas de llamadas recursivas internas.

• El sistema puede no tener suficiente espacio para ejecutar una solución recursiva de algunos problemas.

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

14

Page 15: Recursión MC Beatriz Beltrán Martínez Primavera 2014

• Una solución recursiva particular puede tener una ineficiencia inherente. Tal ineficiencia no es debida a la elección de la implementación del algoritmo; más bien, es un defecto del algoritmo en si mismo.

• Un problema inherente es que algunos valores son calculados una y otra vez causando que la capacidad de la computadora se exceda antes de obtener una respuesta.

• La cuestión de la claridad en la solución es, no obstante, un factor importante.

• En algunos casos una solución recursiva es más simple y más natural de escribir.

FC

C -

BU

AP

Prim

ave

ra 2

01

4B

BM

15

Recursión vs. Iteración