java recursividad

15
Recursividad Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile [email protected]

Upload: kimberly-bugueno-simon

Post on 23-Dec-2015

53 views

Category:

Documents


0 download

DESCRIPTION

inicios de programacion

TRANSCRIPT

Recursividad

Franco Guidi Polanco Escuela de Ingeniería Industrial

Pontificia Universidad Católica de Valparaíso, Chile [email protected]

25-05-14 Franco Guidi Polanco (PUCV-EII) 2

Recursividad

v Es la técnica de definir un proceso en términos de si mismo.

v Por ejemplo, la definición de una “Lista”:

v La definición anterior caracteriza como Lista cada una de las siguientes secuencias de números:

Una LISTA es: número número coma LISTA

•  23, 12, 23, 4 •  7 •  1, 6

25-05-14 Franco Guidi Polanco (PUCV-EII) 3

Recursividad

v Otro ejemplo de recursividad: el factorial de un número.

factorial( x ) = x * factorial( x-1 ) si x > 0 1 si x = 0

25-05-14 Franco Guidi Polanco (PUCV-EII) 4

Ejemplo de función recursiva

v Implementación de la función Factorial:

public class Utiles { public static int factorial(int n){ if( n > 0 ) return n*factorial( n-1 ); else return 1; }

}

public class Ejemplo { public static void main(String[] arg){ System.out.println(Utiles.factorial( 4 )); }

}

25-05-14 Franco Guidi Polanco (PUCV-EII) 5

Ejemplo de función recursiva (cont.)

... r=Utiles.factorial(4); ...

n=4 return 4*factorial(3)

n=3 return 3*factorial(2)

n=2 return 2*factorial(1)

n=1 return 1*factorial(0)

n=0 return 1

... public static int factorial(int n){ if( n > 0 )

return n*factorial(n-1); else

return 1; } ...

Stack de invocaciones del método factorial

25-05-14 Franco Guidi Polanco (PUCV-EII) 6

Ejemplo de función recursiva (cont.)

... r=Utiles.factorial(4); ...

factorial=1 factorial=1

factorial=2

factorial=6

factorial=24

... public static int factorial(int n){ if( n > 0 )

return n*factorial(n-1); else

return 1; } ...

Stack de invocaciones del método factorial

n=4 return 4*factorial(3)

n=3 return 3*factorial(2)

n=2 return 2*factorial(1)

n=1 return 1*factorial(0)

n=0 return 1

25-05-14 Franco Guidi Polanco (PUCV-EII) 7

Recursividad y condición de término

v Debe existir una condición de término o caso base, que establezca cuando el método debe dejar de invocarse recursivamente.

v Debe existir una convergencia a la condición de término en las sucesivas invocaciones al método recursivo.

... public static int factorial(int n){ if( n > 0 )

return n*factorial( n-1 ); else

return 1; } ...

Condición de término: Si n==0 se retorna 1.

Convergencia hacia condición de término: n se avecina a 0 en cada invocación.

25-05-14 Franco Guidi Polanco (PUCV-EII) 8

Tipos de recursividad

v Recursividad directa: cuando un método P contiene dentro de si un llamado a si mismo.

v Recursividad indirecta: cuando un método P contiene dentro de si un llamado a otro método Q que contiene llamados (directos o indirectos) a P.

25-05-14 Franco Guidi Polanco (PUCV-EII) 9

Recursividad y variables locales

v Si un método recursivo utiliza variables locales, estas serán creadas para cada invocación del método. Las variables locales (y sus valores) serán visibles sólo en la correspondiente invocación (cada invocación del procedimiento tiene su propia área de datos).

v Cada invocación a un procedimiento requiere de cierto espacio de memoria, el que sólo es liberado al terminar la ejecución de éste. El espacio de memoria disponible es limitado.

v Los métodos recursivos son normalmente más lentos y consumen más memoria que sus equivalentes no recursivos.

25-05-14 Franco Guidi Polanco (PUCV-EII) 10

Ejemplo 1

v Plantear una función recursiva para calcular la suma de los N primeros enteros positivos.

v Análisis:

... public static int suma(int n){ if( n == 1 )

return 1; else

return n + suma( n-1 ); } ...

Suma( N ) = N + Suma( N-1 ) si N > 1

1 si N = 1 Caso base

Supuesto en esta implementación: el valor de n ingresado inicialmente es mayor que 0.

25-05-14 Franco Guidi Polanco (PUCV-EII) 11

Ejemplo 1 (cont.)

Suma(4) 4+6=10

Suma(3) 3+3=3

Suma(2) 2+1=3 Suma(1)

Suma(3) Suma(2) Suma(1)

1 3 6

25-05-14 Franco Guidi Polanco (PUCV-EII) 12

Ejemplo 2

v Calcular el n-ésimo numero de Fibonacci. v Análisis:

v Ejemplo:

Fib(N) = Fib(N-1) + Fib(N-2) si N > 1 1 si N = 1 Casos base 0 si N = 0

Fib( 0 ) = 0 Fib( 1 ) = 1 Fib( 2 ) = Fib(1) + Fib(0) = 1 + 0 = 1 Fib( 3 ) = Fib(2) + Fib(1) = 1 + 1 = 2 Fib( 4) = Fib(3) + Fib(2) = 2 + 1 = 3

25-05-14 Franco Guidi Polanco (PUCV-EII) 13

Ejemplo 2 (cont.)

v Implementación:

... public static int fibonacci(int n){ if( n <= 1 )

return n; else

return fibonacci( n-1 ) + fibonacci( n-2 ); } ...

25-05-14 Franco Guidi Polanco (PUCV-EII) 14

Ejemplo 2 (cont.)

Fib(3) 1+1=2

Fib(2) 1+0=1

Fib(1)

Fib(0)

Fib(1)

Fib(2) Fib(1)

1

1

1

0

Fib(4) 2+1=3

Fib(3)

2

Fib(2) 1+0=1

Fib(1)

Fib(0)

Fib(1)

0

1

Fib(1)

Fib(0)

Fib(0)

1

25-05-14 Franco Guidi Polanco (PUCV-EII) 15

Una ayuda para saber si entendí la recursividad...

v  Nota: este test sólo es capaz de concluir (en un tiempo suficientemente largo) que Ud. está seguro de haber entendido la recursividad (no es capaz de concluir lo contrario).

Test de aprendizaje de recursividad: Si no está seguro de entender la recursividad lea el Test de aprendizaje de recursividad

en caso contrario deténgase, Ud. ya entendió.