Sunteți pe pagina 1din 3

4.1 Recursividad: La recursividad es una tcnica de programacin importante.

Se utiliza para realizar una llamada a una funcin desde la misma funcin. Como ejemplo til se puede presentar el clculo de nmeros factoriales. l factorial de 0 es, por definicin, 1. Los factoriales de nmeros mayores se calculan mediante la multiplicacin de 1 * 2 * , incrementando el nmero de 1 en 1 hasta llegar al nmero para el que se est calculando el factorial. El siguiente prrafo muestra una funcin, expresada con palabras, que calcula un factorial. Si el nmero es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero. Si el nmero es cero, su factorial es uno. Si el nmero es mayor que cero, se multiplica por l factorial del nmero menor inmediato. Para calcular el factorial de cualquier nmero mayor que cero hay que calcular como mnimo el factorial de otro nmero. La funcin que se utiliza es la funcin en la que se encuentra en estos momentos, esta funcin debe llamarse a s misma para el nmero menor inmediato, para poder ejecutarse en el nmero actual. Esto es un ejemplo de recursividad. La recursividad y la iteracin (ejecucin en bucle) estn muy relacionadas, cualquier accin que pueda realizarse con la recursividad puede realizarse con iteracin y viceversa. Normalmente, un clculo determinado se prestar a una tcnica u otra, slo necesita elegir el enfoque ms natural o con el que se sienta ms cmodo. Claramente, esta tcnica puede constituir un modo de meterse en problemas. Es fcil crear una funcin recursiva que no llegue a devolver nunca un resultado definitivo y no pueda llegar a un punto de finalizacin. Este tipo de recursividad hace que el sistema ejecute lo que se conoce como bucle infinito. Para entender mejor lo que en realidad es el concepto de recursin veamos un poco lo referente a la secuencia de Fibonacci. Principalmente habra que aclarar que es un ejemplo menos familiar que el del factorial, que consiste en la secuencia de enteros. 0,1,1,2,3,5,8,13,21,34,

4.2 Procedimientos recursivos Un procedimiento recursivo es aqul que se llama a s mismo. En general, sta no suele ser la manera ms eficaz de escribir cdigo en Visual Basic.

En el siguiente procedimiento se utiliza la recursividad para calcular el factorial de su argumento original. Consideraciones sobre procedimientos recursivos Condiciones de limitacin. Debe designar un procedimiento recursivo para probar al menos una condicin que pueda poner fin a la recursividad; tambin debe supervisar los casos en los que no se satisface ninguna condicin dentro de un nmero razonable de llamadas recursivas. Si no existe al menos una condicin que pueda cumplirse sin errores, el procedimiento corre un riesgo elevado de ejecutarse en un bucle infinito. Uso de la memoria. La aplicacin tiene una cantidad de espacio limitada para las variables locales. Cada vez que un procedimiento se llama a s mismo, utiliza ms cantidad de ese espacio para las copias adicionales de sus variables locales. Si este proceso contina indefinidamente, se acaba produciendo un error Eficacia. Casi siempre se puede sustituir un bucle por la recursividad. Un bucle no tiene la sobrecarga de transferir argumentos, inicializar el almacenamiento adicional y devolver valores. Su rendimiento puede ser mucho mayor sin llamadas recursivas. Recursividad mutua. Si dos procedimientos se llaman mutuamente, el rendimiento puede ser muy deficiente o incluso puede producirse un bucle infinito. Este tipo de diseo presenta los mismos problemas que un procedimiento recursivo nico, pero puede ser ms difcil de detectar y depurar. Llamadas con parntesis. Cuando un procedimiento Function se llama a s mismo de manera recursiva, debe agregar parntesis detrs del nombre del procedimiento, aun cuando no exista una lista de argumentos. De lo contrario, se considerar que el nombre de la funcin representa al valor devuelto por sta. Pruebas Si escribe un procedimiento recursivo, debe probarlo minuciosamente para asegurarse de que siempre cumple ciertas condiciones de limitacin. Tambin debera comprobar que la memoria no resulta insuficiente debido a la gran cantidad de llamadas recursivas.

4.3 MECANICA DE RECURSION. Es mucho mas difcil desarrollar una solucin recursiva en C para resolver un problema especifico cuando no se tiene un algoritmo. No es solo el programa sino las definiciones originales y los algoritmos los que deben desarrollarse. En general, cuando encaramos la tarea de escribir un programa para resolver un problema no hay razn para buscar una solucin recursiva. La mayora de los problemas pueden resolverse de una manera directa usando mtodos no recursivos. Sin embargo, otros pueden resolverse de una manera mas lgica y elegante mediante la recursin. Volviendo a examinar la funcin factorial. El factor es, probablemente, un ejemplo fundamental de un problema que no debe resolverse de manera recursiva, dado que su solucin iterativa es directa y simple. Sin embargo, examinaremos los elementos que permiten dar una solucin recursiva. Antes que nada,

puede reconocerse un gran nmero de casos distintos que se deben resolver. Es decir, quiere escribirse un programa para calcular 0!, 1!, 2! Y as sucesivamente. Puede identificarse un caso trivial para el cual la solucin no recursiva pueda obtenerse en forma directa. Es el caso de 0!, que se define como 1. El siguiente paso es encontrar un mtodo para resolver un caso complejo en trminos de uno mas simple, lo cual permite la reduccin de un problema complejo a uno mas simple. La transformacin del caso complejo al simple resultara al final en el caso trivial. Esto significara que el caso complejo se define, en lo fundamental, en trminos del mas simple. Examinaremos que significa lo anterior cuando se aplica la funcin factorial. 4! Es un caso mas complejo que 3!. La transformacin que se aplica al numero a para obtener 3 es sencillamente restar 1. Si restamos 1 de 4 de manera sucesiva llegamos a 0, que es el caso trivial. As, si se puede definir 4! en trminos de 3! y, en general, n! en trminos de (n 1)!, se podr calcular 4! mediante la definicin de n! en trminos de (n 1)! al trabajar, primero hasta llegar a 0! y luego al regresar a 4!. En el caso de la funcin factorial se tiene una definicin de ese tipo, dado que: n! = n * (n 1)! Asi, 4! = 4 * 3! = 4 * 3 * 2! = 4 * 3 * 2 * 1! = 4 * 3 * 2 * 1 * 0! = 4 * 3 * 2] * ] = 24 Estos son los ingredientes esenciales de una rutina recursiva: poder definir un caso complejo en trminos de uno ms simple y tener un caso trivial (no recursivo) que pueda resolverse de manera directa. Al hacerlo, puede desarrollarse una solucin si se supone que se ha resuelto el caso ms simple. La versin C de la funcin factorial supone que esta definido (n 1)! y usa esa cantidad al calcular n!. Otra forma de aplicar estas ideas a otros ejemplos antes explicados. En la definicin de a * b, es trivial el caso de b = 1, pues a * b es igual a a. En general, a + b puede definirse en trminos de a * (b 1) mediante la definicin a * b = a * (b 1) + a. De nuevo, el caso complejo se transforma en un caso mas simple al restar 1, lo que lleva, al final, al caso trivial de b = 1. Aqu la recursin se basa nicamente en el segundo parmetro, b. Con respecto al ejemplo de la funcin de Fibonacci, se definieron dos casos triviales: fib(0) = 0 y fib(1) = 1. Un caso complejo fib(n) se reduce entonces a dos ms simples: fib(n 1) y fib(n 2). Esto se debe a la definicin de fib(n) como fib(n 1) + fib(n 2), donde se requiere de dos casos triviales definidos de manera directa. Fib(1) no puede definirse como fib(0) + fib(1) porque la funcin de Fibonacci no est definida para nmeros negativos.

S-ar putea să vă placă și