miércoles, 22 de septiembre de 2010

Recursividad (puntos extras)

Hola compañeros les hablare un poco sobre la recursividad y su uso en la programación 



La recursividad es muy importante ya que se utiliza para realizar una llamada a una función desde la misma función, un ejemplo clásico de ello es el cálculo de números factoriales
 Como sabemos factorial de 0 es, pero los factoriales de números mayores se calculan multiplicando  1 * 2 * ..., así sucesivamente incrementando el número de 1 en 1 hasta llegar al número para el que deseamos calcular 

#include
void main(void)
{
int i, s, n;
long int f;
printf("Ingresa un numero: ");
scanf("%d", &n);
s=0;
f=1;
for (i=1; i<=n; i++) {
s *= i;
f *= i;
}
printf("El factorial de %d es: %ld\n", n, f);
getch();
return 0;
}

Para definir una función en forma recursiva es necesario especificar:

  • Caso(s) base: Donde la recursividad se detien.
  • Paso de recursión: Como se define un elemento distinto del base, en términos de elementos anteriores.
En la actualidad los lenguajes de programación permiten definir funciones de manera recursiva, como por ejemplo el lenguaje C:
       int factorial(int n) {
          if ((n == 0) || (n == 1))
             return(1);
          else
             return(n*factorial(n-1));
       }
    
También las definiciones recursivas pueden expresarse en forma no recursiva dependiendo  del caso, el resultado puede ser más revuelto, una función en C que calcula el factorial en forma iterativa puede ser como la siguiente 
       int factorial(int n) {
          int i, fact = 1;
    
          for (i=2; i<=n; i++)
             fact = fact * i;
          return(fact);
       }
    
Los algoritmos iterativos tienen una ventaja con el uso de memoria, si se comparan con los iterativos. La recursividad necesita  que se guarde el estado de la ejecución antes de cada llamado recursivo, usando mucha memoria, y es probable que esta razón las versiones de recursividad tengan mayores limitaciones al ejecutarse en una computadora.


La aplicación de la recursividad puede ampliarse por ejemplo, para buscar un número en un vector podemos tener una función que reciba como argumento el vector, el rango de búsqueda y el número buscado entre muchas mas.

1 comentario:

  1. Bien. Es importante notar que con factorial, no realmente ganamos eficiencia por recursión (en algunas implementaciones hasta perdemos), sino elegancia. En muchos casos se gana ambos elegancia y eficiencia (ordenamiento), y a veces hasta se pierde eficiencia (fibonacci). Dos puntos extra por esta entrada.

    ResponderEliminar