Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Estructuras Recursivas.

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 5

Recursividad:

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. Él 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.

Propiedades de las definiciones o algoritmos recursivos:

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.

Si en esta salida no puede calcularse ninguna función recursiva. Cualquier caso de


definición recursiva o invocación de un algoritmo recursivo tiene que reducirse a la
larga a alguna manipulación de uno o casos mas simples no recursivos.

Cadenas recursivas:

Una función recursiva no necesita llamarse a sí misma de manera directa. En su lugar,


puede hacerlo de manera indirecta como en el siguiente ejemplo:

a (formal parameters) b (formal parameters)

{{

b (arguments); a (arguments);

..

} /*fin de a*/ } /*fin de b*/


En este ejemplo la función a llama a b, la cual puede a su vez llamar a a, que puede
llamar de nuevo a b. Así, ambas funciones a y b, son recursivas, dado que se llamas a sí
mismo de manera indirecta. Sin embargo, el que lo sean no es obvio a partir del examen
del cuerpo de una de las rutinas en forma individual. La rutina a, parece llamar a otra
rutina b y es imposible determinar que se puede llamar así misma de manera indirecta al
examinar sólo a a.

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.

Volviendo a examinar la función factorial. El factor es, probablemente, un ejemplo


fundamental de un problema que no debe resolverse de manera recursiva, dado que su
solución iterativa es directa y simple. Sin embargo, examinaremos los elementos que
permiten dar una solución recursiva. Antes que nada, puede reconocerse un gran
número de casos distintos que se deben resolver. Es decir, quiere escribirse un programa
para calcular 0!, 1!, 2! Y así sucesivamente. Puede identificarse un caso "trivial" para el
cual la solución no recursiva pueda obtenerse en forma directa. Es el caso de 0!, que se
define como 1. El siguiente paso es encontrar un método para resolver un caso
"complejo" en términos de uno mas "simple", lo cual permite la reducción de un
problema complejo a uno mas simple. La transformación del caso complejo al simple
resultaría al final en el caso trivial. Esto significaría que el caso complejo se define, en
lo fundamental, en términos del mas simple.

Examinaremos que significa lo anterior cuando se aplica la función factorial. 4! Es un


caso mas complejo que 3!. La transformación que se aplica al numero a para obtener 3
es sencillamente restar 1. Si restamos 1 de 4 de manera sucesiva llegamos a 0, que es el
caso trivial. Así, si se puede definir 4! en términos de 3! y, en general, n! en términos de
(n – 1)!, se podrá calcular 4! mediante la definición de n! en términos de (n – 1)! al
trabajar, primero hasta llegar a 0! y luego al regresar a 4!. En el caso de la función
factorial se tiene una definición de ese tipo, dado que:

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.

Con respecto al ejemplo de la función de Fibonacci, se definieron dos casos triviales:


fib(0) = 0 y fib(1) = 1. Un caso complejo fib(n) se reduce entonces a dos más simples:
fib(n –1) y fib(n –2). Esto se debe a la definición de fib(n) como fib(n –1) + fib(n – 2),
donde se requiere de dos casos triviales definidos de manera directa. Fib(1) no puede
definirse como fib(0) + fib(-1) porque la función de Fibonacci no está definida para
números negativos.

La recursividad constituye una de las herramientas más potentes en programación. Es


un concepto matemático conocido.

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.

Ventajas: No es necesario definir la secuencia de pasos exacta para resolver el


problema.

Desventajas: Podría ser menos eficiente.


Para que una definición recursiva este completamente identificada es necesario tener un
caso base que no se calcule utilizando casos anteriores y que la división del problema
converja a ese caso base.
0! = 1
Ejemplo:
xn =
_
1 si n = 0
x · xn−1 si n > 0
Recursividad 4
Ejemplo: Calculo del factorial con n=3.

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.

Recursividad cruzada o indirecta


Son algoritmos donde una función provoca una llamada a sí misma de forma indirecta, a
través de otras funciones.

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.

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.

También podría gustarte