La recursividad es una técnica de programación importante. Se utiliza para realizar una llamada a una función desde la misma función. Como ejemplo útil se puede presentar el cálculo de números factoriales. El factorial de 0 es, por definición, 1. Los factoriales de números mayores se calculan mediante la multiplicación de 1 * 2 * ..., incrementando el número de 1 en 1 hasta llegar al número para el que se está calculando el factorial.
El siguiente párrafo muestra una función, expresada con palabras, que calcula un factorial.
"Si el número es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero. Si el número es cero, su factorial es uno. Si el número es mayor que cero, se multiplica por el factorial del número menor inmediato."
Para calcular el factorial de cualquier número mayor que cero hay que calcular como mínimo el factorial de otro número. La función que se utiliza es la función en la que se encuentra en estos momentos, esta función debe llamarse a sí misma para el número menor inmediato, para poder ejecutarse en el número actual. Esto es un ejemplo de recursividad.
La recursividad y la iteración (ejecución en bucle) están muy relacionadas, cualquier acción que pueda realizarse con la recursividad puede realizarse con iteración y viceversa. Normalmente, un cálculo determinado se prestará a una técnica u otra, sólo necesita elegir el enfoque más natural o con el que se sienta más cómodo.
Claramente, esta técnica puede constituir un modo de meterse en problemas. Es fácil crear una función recursiva que no llegue a devolver nunca un resultado definitivo y no pueda llegar a un punto de finalización. Este tipo de recursividad hace que el sistema ejecute lo que se conoce como bucle "infinito". El siguiente es un ejemplo: omita la primera regla (la de los números negativos) de la descripción verbal del cálculo de un factorial e intente calcular el factorial de un número negativo. Se produce un error, ya que para poder calcular el factorial de, por ejemplo -24, primero hay que calcular el factorial de -25 pero, para hacerlo, primero hay que calcular el factorial de -26 y así sucesivamente. Obviamente, el bucle nunca se detendrá.
Por tanto, es muy importante cuidar al máximo el diseño de las funciones recursivas. Si en alguna ocasión sospecha que existe la posibilidad de que se produzca un bucle infinito, puede hacer que la función cuente el número de veces que se llama a sí misma. Si la función se llama a sí misma demasiadas veces (cualquiera que sea el número de veces que haya decidido) se sale automáticamente.
Aquí está de nuevo la función del factorial, pero esta vez escrita en JScript.
// Función para calcular factoriales. Si se pasa un número // no válido (por ejemplo, uno menor que cero), se devuelve // -1 para indicar la existencia de un error. De lo contrario, el // número se convierte al entero más cercano y se devuelve // su factorial. function factorial(unNumero) { unNumero = Math.floor(unNumero); // Si no es un entero, lo redondea. if (unNumero < 0) { // Si el número es menor que cero, lo rechaza. return -1; } if (unNumero == 0) { // Si el número es 0, su factorial es 1. return 1; } else return (unNumero * factorial(unNumero - 1)); // De lo contrario, la función se llama a sí misma recursivamente hasta terminar. }
Ayuda de Javascript y Vbscript para Javascripts.astalaweb.com. |