Curso recursividad

21
Recursividad Ing. Ricardo Soriano Paredes [email protected]

Transcript of Curso recursividad

Page 1: Curso   recursividad

Recursividad

Ing. Ricardo Soriano Paredes [email protected]

Page 2: Curso   recursividad

RECURSIVIDAD

• Un método o función es recursiva cuando se llama a sí misma.

• Se puede llamar a sí mismo, bien directamente o bienindirectamente a través de otro método.

f1

f1 f2 fn…

Definición

Page 3: Curso   recursividad

Func_Recursiva(m)

Func_Recursiva(m-1)

Func_Recursiva(m-1)

Page 4: Curso   recursividad

Imaginemos que el método func() es recursivo. Cuando este método se ejecuta, en

algún punto, se llamará a sí mismo. Tal como muestra el diagrama, no hay ningún bucle

involucrado, ya que se realiza una copia del método. A continuación, las sentencias de

la copia comienzan a ejecutarse, aunque esta vez con distintos argumentos. Si se

desencadena otra llamada recursiva, se realizará otra copia. Y así sucesivamente hasta

que, en una copia del método func(), los argumentos permitan alcanzar el caso base y

permitan que la copia haga un "return", es decir, que transfiera el control de nuevo a su

padre. En ese momento, el padre toma el control, ejecuta el resto de su sentencia y,

cuando llegue el momento, pasa el control a su padre. Este proceso se repite hasta que

el control vuelve al método de llamada inicial, que ha estado esperando este momento

todo el tiempo y ahora puede terminar.

Page 5: Curso   recursividad

Actividades que realiza una Función recursiva

Los programas recursivos tienden a ser lentos porque generan muchas llamadas a funciones y éstas pueden tener mucha sobrecarga. La sobrecarga es trabajo que la computadora tiene que realizar. Para cada llamada a una función, la computadora debe:

1) Guardar las variables locales del módulo que llama

2) Encontrar el método

3) Hacer copias de los argumentos que llaman por valor

4) Pasar los argumentos

5) Ejecutar el método

6) Encontrar al módulo que llama

7) Restituir las variables locales del módulo que llama.

Page 6: Curso   recursividad

Visualización de la recursión

Page 7: Curso   recursividad

Recursión vs. iteración

• La iteración se puede utilizar en lugar de la recursión• Un algoritmo iterativo utiliza una construcción de bucle

• Un algoritmo recursivo utiliza una estructura de ramificación

• Soluciones recursivas son a menudo menos eficiente, en términos de tiempo y espacio, que las soluciones iterativas.

• La recursividad puede simplificar la solución de un problema, a menudo resulta en menos líneas de código que una solución iterativa.

Un algoritmo recursivo utiliza una estructura de ramificación

Page 8: Curso   recursividad

Recursión vs. iteración

• Cada llamada recursiva produce una nueva creación y copia de las variables de la función, esto consume más memoria e incrementa el tiempo de ejecución. Por el contrario, la iteración se produce dentro de un método, de modo que las operaciones suplementarias en la llamada al método y en la asignación de memoria adicional son omitidas.

Page 9: Curso   recursividad

Consideraciones al hacer una función recursiva

• Determine el caso base• Condición de salida

• Determine el caso general• Función/método recursivo

Un algoritmo recursivo debe tener dos partes: una parte de terminación en la que se deja de hacer llamadas, es el caso base, y una llamada recursiva con sus propios parámetros.

Page 10: Curso   recursividad

Escribir un método recursivo que calcule el factorial de un número n y un programa que pida unnúmero entero y escriba su factorial..

• La función factorial (símbolo: !) se define como el producto de todos los números enteros positivos desde 1 hasta n.

Ejemplo

Page 11: Curso   recursividad

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

5! = 5*4*3*2*1

FCC - BUAP Primavera 2015BBM11

Page 12: Curso   recursividad

FCC - BUAP Primavera 2015BBM12

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 13: Curso   recursividad

Traza del programa factorial

Page 14: Curso   recursividad

public static void main(String[] ar)throws IOException

{

int n;

BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));

do

{

System.out.print("Introduzca número n: ");

n = Integer.parseInt(entrada.readLine());

}while (n < 0);

System.out.println("\n \t" + n + "!= " + factorial(n));

}

static double factorial (int n)

{

if (n <= 1)

return 1;

else

{

double resultado = n * factorial(n - 1);

return resultado;

} }

Page 15: Curso   recursividad

Inicialmente, en la ubicación “A” hay una pila de discos. EL disco más pequeño está en la parte superior, y el diámetro de los discos aumenta a medida que se desciende hacia la base de la “torre”. Las ubicaciones, “B” y “C” están vacías inicialmente.

Fuente Auxiliar Destino

Reglas:

- Mover un disco a la vez.

- Nunca colocar un disco encima de un disco más pequeño.

Ejemplo Torres de Hanoi

Page 16: Curso   recursividad
Page 17: Curso   recursividad

Análisis paso a paso – Torres de Hanoi

2 A,C,B

3 A,B,C

1 A,B,C

A->C

A->B

C->B

A->C

N

N

2 B,A,C

1 B,C,A

B->A

B->C

1 A,B,C

A->C

N

Page 18: Curso   recursividad

Ejemplo Gráfico - Torres de Hanoi

Autor [Daniel Alvarez]

Page 19: Curso   recursividad

Tipos de recursión

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

• Factorial

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

• Fibonacci

FCC - BUAP Primavera 2015BBM19

Page 20: Curso   recursividad

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

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

FCC - BUAP Primavera 2015BBM20

Tipos de recursión

Page 21: Curso   recursividad

Conclusiones

• Se ha de evitar utilizar recursividad en situaciones de rendimiento crítico o exigencia de altas prestaciones en tiempo y en memoria, ya que las llamadas recursivas emplean tiempo y consumen memoria adicional. No es conveniente el uso de una llamada recursiva para sustituir un simple bucle.

• La solución recursiva siempre requerirá más tiempo y espacio debido a las llamadas adicionales a los métodos.

Fuente [Joyanes A. Luis, “Estructura De Datos en Java” ]