miércoles, 14 de marzo de 2012

4.2 Procedimientos Recursivos.


Un procedimiento recursivo es aquél que se llama a sí mismo. En general, ésta no suele ser la manera más eficaz de escribir código en Visual Basic.
En el siguiente procedimiento se utiliza la recursividad para calcular el factorial de su argumento original.
Visual Basic
 Copiar código
Function factorial(By Val? n As Integer) As Integer If n <= 1 Then Return 1 Else Return factorial(n - 1) * n End If End Function
Consideraciones sobre procedimientos recursivos
Condiciones de limitación. Debe designar un procedimiento recursivo para probar al menos una condición que pueda poner fin a la recursividad; también debe supervisar los casos en los que no se satisface ninguna condición dentro de un número razonable de llamadas recursivas. Si no existe al menos una condición que pueda cumplirse sin errores, el procedimiento corre un riesgo elevado de ejecutarse en un bucle infinito.
Uso de la memoria. La aplicación tiene una cantidad de espacio limitada para las variables locales. Cada vez que un procedimiento se llama a sí mismo, utiliza más cantidad de ese espacio para las copias adicionales de sus variables locales. Si este proceso continúa indefinidamente, se acaba produciendo un error Stack Overflow Exception?.
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 diseño presenta los mismos problemas que un procedimiento recursivo único, pero puede ser más difícil de detectar y depurar.
Llamadas con paréntesis. Cuando un procedimiento Function se llama a sí mismo de manera recursiva, debe agregar paréntesis detrás del nombre del procedimiento, aun cuando no exista una lista de argumentos. De lo contrario, se considerará que el nombre de la función representa al valor devuelto por ésta.
Pruebas Si escribe un procedimiento recursivo, debe probarlo minuciosamente para asegurarse de que siempre cumple ciertas condiciones de limitación. También debería comprobar que la memoria no resulta insuficiente debido a la gran cantidad de llamadas recursivas.
E J E M P L O
Supongamos que P es un procedimiento que contiene una sentencia de Llamada a si mismo o una sentencia de Llamada a un segundo procedimiento que puede eventualmente llamar de vuelta al procedimiento original P. Entonces P se dice que es u procedimiento recursivo. Como el progrma no ha de continuar ejecutandose indefinidamente, un procedimiento recursivo ha de tener las dos siguientes propiedades:
(1) Debe existir un cierto criterio, llamado criterio base, por el que el procedimiento no se llama asi mismo.
(2) Cada vez que el procedimiento se llame a si mismo(directa o inderectamente), debe estar mas cerca del criterio base.
Un procedimiento recursivo con estas dos propiedades se dice que esta bien definido.
Similarmente, una funcion se dice que esta definida recursivamente si la definicion de la funcion se refiere a si misma. De nuevo, para que la definicion no sea circular, debe tener las dos siguientes propiedades:
(1) Debe haber ciertos argumentos, llamados valores base, para los que la funcion no se refiera a si misma.
(2) Cada vez que la funcion se refiera a si misma, el argumento de la funcion debe acercarse mas al valor base.
Una funcion recursiva con estas dos propiedades se dice tambien que esta bien definida.
Tipos.
Podemos distinguir dos tipos de recursividad:
Directa: Cuando un subprograma se llama a si mismo una o mas veces directamente. Indirecta: Cuando se definen una serie de subprogramas usándose unos a otros.
Características.
Un algoritmo recursivo consta de una parte recursiva, otra iterativa o no recursiva y un acondición de terminación. La parte recursiva y la condición de terminación siempre existen. En cambio la parte no recursiva puede coincidir con la condición de terminación. Algo muy importante a tener en cuenta cuando usemos la recursividad es que es necesario asegurarnos que llega un momento en que no hacemos más llamadas recursivas. Si no se cumple esta condición el programa no parará nunca.
Ventajas e inconvenientes. La principal ventaja es la simplicidad de comprensión y su gran potencia, favoreciendo la resolución de problemas de manera natural, sencilla y elegante; y facilidad para comprobar y convencerse de que la solución del problema es correcta. El principal inconveniente es la ineficiencia tanto en tiempo como en memoria, dado que para permitir su uso es necesario transformar el programa recursivo en otro iterativo, que utiliza bucles y pilas para almacenar las variables. 

No hay comentarios:

Publicar un comentario