Está en la página 1de 8

RECURSIVIDAD La recursividad (recursin) es una tcnica de programacin elemental que permite que una funcin pueda llamarse asimismo

desde la misma funcin. Se puede utilizar la recursividad como una alternativa a la iteracin. La recursividad es una herramienta poderosa e importante en la resolucin de problemas en programacin. Una solucin recursiva es normalmente menos eficiente en trminos de tiempo de computadora que una solucin iterativa debido a las operaciones auxiliares que llevan consigo las llamadas suplementarias a las funciones: sin embargo, en muchas circunstancias el uso las de la recursin permite ms a los programadores especificar soluciones naturales, lgicas,

elegantes, sencillas, que seran, en caso contrario difcil de resolver. La recursin permite definir un objeto (problemas, estructuras de datos) en trminos de s mismo. Casos tpicos de estructuras de datos definidas de manera recursiva son los rboles y las listas ligadas. Algunos ejemplos de problemas que se definen recursivamente son el factorial de un nmero, la serie de Fibonacci, etc. Un ejemplo tpico de recursividad sera la funcin factorial. El factorial es una funcin matemtica que se resuelve multiplicando ese nmero por todos los nmeros naturales que hay entre l y 1. Por ejemplo, factorial de 4 es igual a 4 * 3 * 2 * 1. Si nos fijamos, para el ejemplo de factorial de 4 (factorial se expresa matemticamente con un signo de admiracin hacia abajo, como 4!), se puede resolver como 4 * 3! (4 * factorial de 3). Es decir, podemos calcular el factorial de un nmero multiplicando ese nmero por factorial de ese nmero menos 1. n! = n * (n-1)!

En el caso de la funcin factorial, tenemos el caso bsico que factorial de 1 es igual a 1. As que lo podremos utilizar como punto de ruptura de las llamadas recursivas. As pues, vamos a realizar la codificacin de la funcin recursiva factorial. Primero veamos un pseudocdigo: funcion factorial(n) si n=1 entonces factorial = 1 sino factorial = n * factorial(n-1) fin funcion Ahora veamos cmo se implementara esta funcin con el lenguaje de programacin Javascript: function factorial(n){ if(n==1) return 1 else return n * factorial(n-1) } Como se puede ver, la recursividad no representa ninguna dificultad y de hecho es una herramienta muy til para programacin de algoritmos. ALGORITMO RECURSIVO Un algoritmo recursivo es un algoritmo que se define en trminos de s mismo. Son implementados en forma de subrutinas (funciones, procedimientos, subprogramas, etc) de tal forma que dentro de un subrutina recursiva hay una o ms llamadas a s misma.

Algoritmos Recursivos Aplicados en las Ciencias de la Computacin En ciencias de la computacin, la recursividad es un elemento muy importante en la solucin de algunos problemas. Por definicin, un algoritmo recursivo es aquel que utiliza una parte de l mismo como solucin al problema. La otra parte generalmente es la solucin trivial, es decir, aquella cuya solucin ser siempre conocida, es muy fcil de calcular, o es parte de la definicin del problema a resolver. Dicha solucin sirve como referencia y adems permite que el algoritmo tenga una cantidad finita de pasos. La implementacin de estos algoritmos se realiza generalmente en conjunto con una estructura de datos, la pila, en la cual se van almacenando los resultados parciales de cada recursin. QUE ASPECTOS DEBEN TOMARSE EN CUENTA A LA HORA DE ELEGIR ENTRE UN ALGORITMO RECURSIVO Y UNO ITERATIVO? Aspectos que hay que considerar al decidir cmo implementar la solucin a un problema si es de forma iterativa o de forma recursiva: La carga computacional (tiempo de CPU y espacio en memoria) asociada a las llamadas recursivas. La redundancia (algunas soluciones recursivas resuelven un problema en repetidas ocasiones). La complejidad de la solucin (en ocasiones, la solucin iterativa es muy difcil de encontrar). La concisin, legibilidad y elegancia del cdigo resultante de la solucin recursiva del problema. ESTABLEZCA LAS DIFERENCIAS ENTRE RECURSIVIDAD E ITERACIN 1. Ambas realizan una repeticin:

a) b) 2. a)

Solucin iterativa repite el cuerpo del bucle. Solucin recursiva repite las llamadas al mtodo recursivo. Ambas tienen una condicin de terminacin. Solucin iterativa: termina cuando se imcumple la condicin

de continuacin del bucle. b) Solucin recursiva: se termina cuando una llamada alcanza

el caso base (induccin) desencadenando una secuencia de vuelta atrs. Backtracking: sucesin de pruebas tentativas. 3. Ambas se deben disear para converger a la solucin

(principio de convergencia, y que no se salten la condicin de terminacin). a) Solucin iterativa: se llega a cumplir la condicin de

terminacin (esto se debe garantizar). b) base. Toda solucin recursiva puede encontrar una solucin iterativa equivalente, mientras que lo contrario no siempre es cierto Ejemplo: Programa que calcula el factorial de un nmero El cdigo del programa que calcula el factorial es el siguiente: FUNCION RECURSIVA #include<iostream> #include<iomanip> long factorial(long); Solucin recursiva: se debe garantizar que se llegue al caso

int main(){ int num; cout<<"Entre el numero: "; cin>>num; for(int i=0; i<=num; i++) cout <<setw(2)<<i<<"!=" <<factorial(i) << endl; return 0;} //Definicion Recursiva de la //Funcion Factorial long factorial (long num){ if (number<=1) return 1; else return num*factorial(num-1);} // Obsrvese como la funcin se // Llama as misma FUNCION ITERATIVA #include<iostream.h> long factorial(long); int main() { int num, fact; cout<<"Entre un nmero "; cin>>num;

resultado=factorial(num); cout<<"El factorial es:"<<fact <<endl; return 0;} long factorial(long num1) { int var=1; int n=1; while(n<=num1){ var=var*n; n++; } return var; }

En conclusin la

diferencia

que

podemos

encontrar

en

la funcin recursiva y la iterativa es que la recursiva tienes que hacer constantes llamadas en las funciones que tienes en tu algoritmo o programa, mientras que en la iterativa no son necesarias tantas llamadas para la solucin del problema. DIVIDE Y VENCERAS La tcnica de diseo de algoritmos llamada "divide y vencers" (divide and conquer) consiste en descomponer el problema original en varios sub-problemas ms sencillos, para luego resolver stos mediante un clculo sencillo. Por ltimo, se combinan los resultados de cada subproblema para obtener la solucin del problema original. El pseudocdigo sera:

funcion divide_y_venceras_1(problema) { descomponer el problema en n subproblemas ms pequeos; para i=1 hasta n hacer resolver el subproblema k; combinar las n soluciones; } Un ejemplo de "divide y vencers" es la ordenacin rpida, o quicksort, utilizada para ordenar arrays. En ella, se divida el array en dos sub-arrays, para luego resolver cada uno por separado, y unirlos (ver algoritmos de ordenacin). El ahorro de tiempo es grande: el tiempo necesario para ordenar un array de elementos mediante el mtodo de la burbuja es cuadrtico: kN2. Si dividimos el array en dos y ordenamos cada uno de ellos, el tiempo necesario para resolverlo es ahora k(N/2)2+k(N/2)2=(kN2)/2. El tiempo necesario para ordenarlo es la mitad, pero sigue siendo cuadrtico. Pero ahora, si los subproblemas son todava demasiado grandes, por qu no utilizar la misma tctica con ellos, esto es, dividirlos a ellos tambin, utilizando un algoritmo recursivo (ver recursividad) que vaya dividiendo ms el sub-problema hasta que su solucin sea trivial? Un algoritmo del tipo: funcion divide_y_venceras(problema) { si el problema es trivial entonces resolver el problema; si no es trivial { descomponer el problema en n subproblemas ms pequeos; para i=1 hasta n hacer

divide_y_venceras(subproblema_k); combinar las n soluciones; } } Si aplicamos este mtodo al quicksort, el tiempo disminuye hasta ser logartmico, con lo que el tiempo ahorrado es mayor cuanto ms aumenta N.

También podría gustarte