Está en la página 1de 2

Recursividad

La recursividad, es un concepto bastante importante y bien bsico de la programacin. Sin embargo es bastante difcil de asimilar al principio. Se supone que es algo que se va entendiendo con prctica y tiempo. La mejor definicin sin duda de la recursin, es la encontrada en el diccionario hacker: Recursin Por ejemplo GNU, es un acrnimo recursivo (GNUs Not Unix), ya que la G en GNU, significa GNU, cuya G significa GNU, y as recursivamente Pensar de forma recursiva es complicado, y no es un proceso intuitivo. En programacin, una funcin es recursiva cuando se llama a s misma. A continuacin un ejemplo para intentar entender recursividad. A m me viene bien para practicarlo para mi examen de algoritmos en marzo. Espero que quede entendible! Uno de los ejemplos ms clsicos es el factorial de un nmero. Intenta seguir la explicacin razonando cada paso. Para cualquier entero positivo N, el factorial de N (que se expresa como N!) es el producto (multiplicacin) de todos los enteros menor a l:

1! = 1 2! = 1 x 2 = 2 3! = 1 x 2 x 3 = 6 4! = 1 x 2 x 3 x 4 = 24 5! = 1 x 2 x 3 x 4 x 5 = 120 6! = 1 x 2 x 3 x 4 x 5 x 6 = 720

Ahora, repasando atentamente, se puede ver que el factorial de cada nmero incluye el factorial de todos los nmeros anteriores a l. Lo escrito en corchetes rectos a continuacin es una referencia, no a nivel matemtico: 2! es 1[1!] x 2 3! es (1 x 2)[2!] x 3 Y as sucesivamente. Para cualquier entero N mayor a 1, podemos decir que el factorial de N es igual al factorial del nmero anterior a N multiplicado por N. La frmula N! = (N-1)! x N. Vuelve a la lista de factoriales de 1 a 6. Busca en cada caso los trminos que son factorial del nmero anterior para darte cuenta. Entonces se podra decir que una buena prctica es encontrar el factor en el resultado que se repite.

Pasando esto a funcin en C, podemos hacer una funcin a la que le pasamos un nmero, y nos devuelve la factorial:
int factorial(int n){ return n * factorial(n - 1);

Ah tenemos nuestra primera funcin recursiva. Pero si compilamos el cdigo y ejecutamos el programita, obtenemos una hermosa violacin de segmento. El problema es que la funcin definida arriba no termina nunca, va a seguir restndole 1 a N por siempre. Siempre vamos a poder restarle 1 a cualquier n, por lo que la funcin va a seguir ejecutndose a s misma por siempre. Adems, para cualquier nmero positivo, factorial de n va a devolver 0, porque cualquier multiplicacin con 0 como trmino devuelve 0. Y restarle 1 recursivamente a cualquier entero positivo, eventualmente dar cero. Para que la funcin recursiva est completa, adems de llamarse a s misma, necesita una forma de finalizar, una condicin. Por definicin, el factorial de 1 es 1 (1!=1) as como el factorial de 0 (0!=1) tambin es 1. Por lo que podemos implementar sta condicin para que la funcin no sea interminable. As, la definicin de la funcin consta de la recursiva que se llama a s misma, y la condicin para detenerse.
int factorial(int n){ if n==1{ return 1; }else{ return n * factorial(n-1); } }

O con un while:
int factorial(int n){ while (n!=1){ return n * factorial(n-1); } return 1; }