Вы находитесь на странице: 1из 4

Tipos de recursividad Recursividad directa: cuando un mtodo P contiene dentro de si un llamado a si mismo.

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

Recursividad
Claudio Cubillos
Escuela de Ingeniera Informtica Pontificia Universidad Catlica de Valparaso, Chile claudio.cubillos@ucv.cl *Material realizado por el Prof. Franco Guidi

Actualizacin: 18 de marzo de 2010


Franco Guidi Polanco (PUCV-EII) 28/09/2010 2

Recursividad Otro ejemplo de recursividad: el factorial de un nmero.

Ejemplo de funcin recursiva Implementacin de la funcin 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 )); } }

factorial( x ) =

x * factorial( x-1 ) 1

si x > 0 si x = 0

Franco Guidi Polanco (PUCV-EII)

28/09/2010

Franco Guidi Polanco (PUCV-EII)

28/09/2010

Ejemplo de funcin recursiva (cont.)


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

Ejemplo de funcin recursiva (cont.)


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

Stack de invocaciones del mtodo factorial

Stack de invocaciones del mtodo factorial

n=0 n=1 n=2 n=3 n=4 ... r=Utiles.factorial(4); ...


Franco Guidi Polanco (PUCV-EII) 28/09/2010

return 1 return 1*factorial(0) return 2*factorial(1)

factorial=1 factorial=1 factorial=2

n=0 n=1 n=2 n=3

return 1 return 1*factorial(0) return 2*factorial(1) return 3*factorial(2) return 4*factorial(3)

return 3*factorial(2) factorial=6 return 4*factorial(3) factorial=24 ... r=Utiles.factorial(4); ...


5 Franco Guidi Polanco (PUCV-EII) 28/09/2010

n=4

Recursividad y condicin de trmino


Debe existir una condicin de trmino o caso base, que establezca cuando el mtodo debe dejar de invocarse recursivamente. Debe existir una convergencia a la condicin de trmino en las sucesivas invocaciones al mtodo recursivo.
... public static int factorial(int n){ if( n > 0 ) return n*factorial( n-1 ); else return 1; } ...

Recursividad y variables locales


Si un mtodo recursivo utiliza variables locales, estas sern creadas para cada invocacin del mtodo. Las variables locales (y sus valores) sern visibles slo en la correspondiente invocacin (cada invocacin del procedimiento tiene su propia rea de datos). Cada invocacin a un procedimiento requiere de cierto espacio de memoria, el que slo es liberado al terminar la ejecucin de ste. El espacio de memoria disponible es limitado. Los mtodos recursivos son normalmente ms lentos y consumen ms memoria que sus equivalentes no recursivos.
7 Franco Guidi Polanco (PUCV-EII) 28/09/2010 8

Condicin de trmino: Si n==0 se retorna 1. Convergencia hacia condicin de trmino: n se avecina a 0 en cada invocacin.

Franco Guidi Polanco (PUCV-EII)

28/09/2010

Ejemplo 1
Plantear una funcin recursiva para calcular la suma de los N primeros enteros positivos. Anlisis: 1 Suma( N ) = N + Suma( N-1 )
... public static int suma(int n){ if( n == 1 ) return 1; else return n + suma( n-1 ); } ...

Ejemplo 1 (cont.)

si N = 1 si N > 1

Caso base

Suma(3)

Suma(2)

Suma(1)

Suma(4) 4+6=10
6

Suma(3) 3+3=3
3

Suma(2) 2+1=3
1

Suma(1)

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

Franco Guidi Polanco (PUCV-EII)

28/09/2010

Franco Guidi Polanco (PUCV-EII)

28/09/2010

10

Ejemplo 2
Calcular el n-simo numero de Fibonacci. Anlisis: 0 si N = 0 1 si N = 1 Fib(N-1) + Fib(N-2) si N > 1
Casos base

Ejemplo 2 (cont.)
Implementacin:
... public static int fibonacci(int n){ if( n <= 1 ) return n; else return fibonacci( n-1 ) + fibonacci( n-2 ); } ...

Fib(N) = Ejemplo:

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
Franco Guidi Polanco (PUCV-EII) 28/09/2010 11 Franco Guidi Polanco (PUCV-EII) 28/09/2010 12

Ejemplo 2 (cont.)
Fib(1)
1 Fib(0) 0

Fib(1) Fib(2)

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

Fib(3)

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

Fib(0)

Fib(1)

Fib(4) 2+1=3

Fib(1)
1 Fib(0)

Fib(2) 1+0=1
0

Fib(0)
13

Franco Guidi Polanco (PUCV-EII)

28/09/2010

Вам также может понравиться