Vous êtes sur la page 1sur 5

Primero debemos decir que la recursividad no es una estructura de datos, sino que es una tcnica de programacin que nos

permite que un bloque de instrucciones se ejecute n veces. Remplaza en ocasiones a estructuras repetitivas. Este concepto ser de gran utilidad para el captulo de la estructura de datos tipo rbol. La recursividad es un concepto difcil de entender en principio, pero luego de analizar diferentes problemas aparecen puntos comunes. En Java los mtodos pueden llamarse a s mismos. Si dentro de un mtodo existe la llamada a s mismo decimos que el mtodo es recursivo. Cuando un mtodo se llama a s mismo, se asigna espacio en la pila para las nuevas variables locales y parmetros. Al volver de una llamada recursiva, se recuperan de la pila las variables locales y los parmetros antiguos y la ejecucin se reanuda en el punto de la llamada al mtodo.
La recursividad es una tcnica potente de programacin que puede utilizarse en lugar de la iteracin para resolver determinados tipos de problemas.

Por ejemplo, para escribir un mtodo que calcule el factorial de un nmero entero no negativo, podemos hacerlo a partir de la definicin de factorial:
0! = 1 n! = n * (n1) * (n2) * ... * 3 * 2 * 1 si n>0 Esto dar lugar a una solucin iterativa en Java mediante un bucle for: // Mtodo Java no recursivo para calcular el factorial de un nmero public double factorial(int n){ double fact=1; int i; if (n==0) fact=1; else for(i=1;i<=n;i++) fact=fact*i; return fact; } Pero existe otra definicin de factorial en funcin de s misma: 0! = 1 n! = n (n 1)! , si n > 0 (El factorial de n es n por el factorial de n-1) Esta definicin da lugar a una solucin recursiva del factorial en Java: // Mtodo Java recursivo para calcular el factorial de un nmero public double factorial(int n){ if (n==0)

return 1; else return n*(factorial(n-1)); } Un mtodo es recursivo cuando entre sus instrucciones se encuentra una llamada a s mismo. La solucin iterativa es fcil de entender. Utiliza una variable para acumular los productos y obtener la solucin. En la solucin recursiva se realizan llamadas al propio mtodo con valores de n cada vez ms pequeos para resolver el problema. Cada vez que se produce una nueva llamada al mtodo se crean en memoria de nuevo las variables y comienza la ejecucin del nuevo mtodo. Para entender el funcionamiento de la recursividad, podemos pensar que cada llamada supone hacerlo a un mtodo diferente, copia del original, que se ejecuta y devuelve el resultado a quien lo llam. En la figura siguiente podemos ver como sera la ejecucin del programa Java anterior para calcular el factorial de 3.

Un mtodo recursivo debe contener: Uno o ms casos base: casos para los que existe una solucin directa. Una o ms llamadas recursivas: casos en los que se llama s mismo

Caso base: Siempre ha de existir uno o ms casos en los que los valores de los parmetros de entrada permitan al mtodo devolver un resultado directo. Estos casos tambin se conocen como solucin trivial del problema. En el ejemplo del factorial el caso base es la condicin: if (n==0) return 1; si n=0 el resultado directo es 1 No se produce llamada recursiva

Llamada recursiva: Si los valores de los parmetros de entrada no cumplen la condicin del caso base se llama recursivamente al mtodo. En las llamadas recursivas el valor del parmetro en la llamada se ha de modificar de forma que se aproxime cada vez ms hasta alcanzar al valor del caso base. En el ejemplo del factorial en cada llamada recursiva se utiliza n-1 return n * ( factorial(n-1) ); por lo que en cada llamada el valor de n se acerca ms a 0 que es el caso base. La recursividad es especialmente apropiada cuando el problema a resolver (por ejemplo calculo del factorial de un nmero) o la estructura de datos a procesar (por ejemplo los rboles) tienen una clara definicin recursiva. No se debe utilizar la recursin cuando la iteracin ofrece una solucin obvia. Cuando el problema se pueda definir mejor de una forma recursiva que iterativa lo resolveremos utilizando recursividad. Para medir la eficacia de un algoritmo recursivo se tienen en cuenta tres factores: Tiempo de ejecucin Uso de memoria Legibilidad y facilidad de comprensin

Las soluciones recursivas suelen ser ms lentas que las iterativas por el tiempo empleado en la gestin de las sucesivas llamadas a los mtodos. Adems consumen ms memoria ya que se deben guardar los contextos de ejecucin de cada mtodo que se llama. A pesar de estos inconvenientes, en ciertos problemas, la recursividad conduce a soluciones que son mucho ms fciles de leer y comprender que su correspondiente solucin iterativa. En estos casos una mayor claridad del algoritmo puede compensar el coste en tiempo y en ocupacin de memoria.

De todas maneras, numerosos problemas son difciles de resolver con soluciones iterativas, y slo la solucin recursiva conduce a la resolucin del problema (por ejemplo, Torres de Hanoi o recorrido de rboles).

Vous aimerez peut-être aussi