Curso recursividad

Post on 28-Jan-2018

480 views 0 download

Transcript of Curso recursividad

Recursividad

Ing. Ricardo Soriano Paredes sorianoricardo@Hotmail.com

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

Func_Recursiva(m)

Func_Recursiva(m-1)

Func_Recursiva(m-1)

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.

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.

Visualización de la recursión

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

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.

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.

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

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

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

FCC - BUAP Primavera 2015BBM11

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

Traza del programa factorial

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;

} }

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

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

Ejemplo Gráfico - Torres de Hanoi

Autor [Daniel Alvarez]

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

• 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

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” ]