Estructuras Recursivas.
Estructuras Recursivas.
Estructuras Recursivas.
Un requisito importante para que sea correcto un algoritmo recursivo es que no genere
una secuencia infinita de llamadas así mismo. Claro que cualquier algoritmo que genere
tal secuencia no termina nunca. Una función recursiva f debe definirse en términos que
no impliquen a f al menos en un argumento o grupo de argumentos. Debe existir una
"salida" de la secuencia de llamadas recursivas.
Cadenas recursivas:
{{
b (arguments); a (arguments);
..
Pueden incluirse mas de dos rutinas en una cadena recursiva. Así, una rutina a puede
llamar a b, que llama a c, ..., que llama a z, que llama a a. Cada rutina de la cadena
puede potencialmente llamarse a sí misma y, por lo tanto es recursiva. Por supuesto, el
programador debe asegurarse de que un programa de este tipo no genere una secuencia
infinita de llamadas recursivas.
Programación Recursiva:
Es mucho mas difícil desarrollar una solución 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 razón para buscar una
solución recursiva. La mayoría de los problemas pueden resolverse de una manera
directa usando métodos no recursivos. Sin embargo, otros pueden resolverse de una
manera mas lógica y elegante mediante la recursión.
n! = n * (n – 1)!
Así, 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 términos de uno más "simple" y tener un caso "trivial" (no recursivo) que
pueda resolverse de manera directa. Al hacerlo, puede desarrollarse una solución si se
supone que se ha resuelto el caso más simple. La versión C de la función 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 definición de
a * b, es trivial el caso de b = 1, pues a * b es igual a a. En general, a + b puede
definirse en términos de a * (b – 1) mediante la definición 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 recursión se basa únicamente en el segundo
parámetro, b.
Por ejemplo,
Definición recursiva
n! =
1 si n = 0
n · (n − 1)! si n > 0
Demostración por inducción:
demostrar para un caso base y después para un tamaño n, considerando que está
demostrado para valores menores
que n. Una función que se llama a si misma se
denomina recursiva .Podemos usar recursividad si la solución de un
problema está expresada en función de si misma, aunque de menor tamaño y
conocemos la solución no-recursiva para un determinado caso.
3! = 3 * 2! 3! = 3 * 2!
2! = 2 * 1!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 1
1
3! = 3 * 2!
2! = 2 * 1
1! = 1 * 1 = 1
3! = 3 * 2
2! = 2 * 1 = 2
3! = 3 * 2 = 6
Tipos de recursión
Recursividad simple
Aquella en cuya definición sólo aparece una llamada recursiva. Se puede transformar
con facilidad en algoritmos iterativos.
Recursividad múltiple
Se da cuando hay más de una llamada a sí misma dentro del cuerpo de la función,
resultando más difícil de hacer de forma iterativa. Un ejemplo típico es la función de
fibonacci
Recursividad anidada
En algunos de los argumentos de la llamada recursiva hay una nueva llamada a sí
misma.
Características:
Un algoritmo recursivo consta de una parte recursiva, otra iterativa o no recursiva y una
condició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.