Está en la página 1de 6

PROGRAMACIN II

WORK PAPER #2
RECURSIVIDAD

Recursividad es, en ciencias de computacin, una forma de atajar y solventar problemas. De


hecho, es una de las ideas centrales de las ciencias de computacin. Resolver un problema
mediante recursin significa que la solucin depende de las soluciones de pequeas instancias
del mismo problema.
El poder de la recursin evidentemente se fundamenta en la posibilidad de definir un conjunto
infinito de objetos con una declaracin finita. Igualmente, un nmero infinito de operaciones
computacionales puede describirse con un programa recursivo finito, incluso en el caso de que
este programa no contenga repeticiones explcitas."
La mayora de los lenguajes de programacin dan soporte a la recursin permitiendo a una
funcin llamarse a s misma desde el texto del programa. Los lenguajes imperativos definen las
estructuras de loops como while y for que son usadas para realizar tareas repetitivas. Algunos
lenguajes de programacin funcionales no definen estructuras de loops sino que posibilitan la
recursin llamando cdigo de forma repetitiva. La teora de la computabilidad ha demostrado que
estos dos tipos de lenguajes son matemticamente equivalentes, es decir que pueden resolver
los mismos tipos de problemas, aunque los lenguajes funcionales carezcan de las tpicas
estructuras while y for .

rbol basado en la recursin creado usando el lenguaje de programacin Logo.

PROGRAMACIN RECURSIVA
Crear una subrutina recursiva requiere principalmente la definicin de un "caso base", y entonces
definir reglas para subdividir casos ms complejos en el caso base. Para una subrutina recursiva
es esencial que con cada llamada recursiva, el problema se reduzca de forma que al final llegue
al caso base.
Algunos expertos clasifican la recursin como "generativa" o bien "estructural". La distincin se
hace segn de donde provengan los datos con los que trabaja la subrutina. Si los datos proceden
de una estructura de datos similar a una lista, entonces la subrutina es "estructuralmente
recursiva"; en caso contrario, es "generativamente recursiva".
Muchos algoritmos populares generan una nueva cantidad de datos a partir de los datos
aportados y recurren a partir de ah. HTDP (How To Design Programs), al espaol, "Cmo disear
programas", se refiere a esta variante como recursin generativa. Ejemplos de recursin
generativa incluyen: mximo comn divisor, quicksort, bsqueda binaria, mergesort, Mtodo de
Newton, fractales e integracin adaptiva.
Suma Recursiva
Para convertir la suma en una funcin recursiva se la debe descomponer en algo ms elemental.
Entonces surge la pregunta: Qu operacin puede ser ms elemental que la suma? Aunque no
lo parezca la respuesta es muy simple: la suma se puede descomponer en conteos de 1 en 1. Es
decir, si se quiere sumar los nmeros 5 y 3 se sabe que el resultado es 8, y se podra llegar a ese
mismo resultado, si en vez de sumar se descomponen las unidades que componen al segundo
nmero (en este caso el 3) en sus unidades correspondientes de la siguiente manera:
8
SumaRecursiva 5 3 8
7
SumaRecursiva (5 2) 1 8
6
SumaRecursiva (5 1) 1 7
5
SumaRecursiva (5 0) 1 6
Como puede apreciarse en la figura, se ingresa a la funcin recursiva en 4 oportunidades
distintas. En las 3 primeras la funcin se invoca a s misma rebajando el valor del segundo
sumando en 1 hasta llegar a 0. Cuando ingresa por cuarta vez el valor del segundo sumando que
ya es 0, hace que la funcin retorne el valor del primer sumando (que es 5) y empieza a salir
consecutivamente de las 4 veces que ingres a s misma, sumando en 3 oportunidades 1 al valor
de la funcin.
Factorial Recursivo
Un ejemplo clsico de una subrutina recursiva es la funcin usada para calcular el factorial de
un entero.
Definicin de la funcin:

Pseudocdigo (recursivo):

funcin factorial:
input: entero n de forma que n >= 0
output: [n (n-1) (n-2) 1]

1. if n es 0, return 1
2. else, return [ n factorial(n-1) ]

end factorial
Una relacin recurrente es una ecuacin que relaciona trminos posteriores en la secuencia con
trminos previos.
Relacin recurrente de un factorial:

Computando la relacin recurrente para n = 4:

b4 = 4 * b3
= 4 * 3 * b2
= 4 * 3 * 2 * b1
= 4 * 3 * 2 * 1 * b0
=4*3*2*1*1
=4*3*2*1
=4*3*2
=4*6
= 24

Esta funcin factorial tambin puede describirse sin usar recursin haciendo uso de tpicas
estructuras de bucle que se encuentran en lenguajes de programacin imperativos:

Pseudocdigo (iterativo):

funcin factorial es:


input: entero n de forma que n >= 0
output: [n (n-1) (n-2) 1]

1. crear una variable nueva llamada running_total con un valor = 1

2. begin loop
1. si n es = 0, salir del loop
2. cambiar running_total a (running_total n)
3. decrementar n
4. repetir el loop

3. return running_total
end factorial

Recursin frente a iteracin


En el ejemplo "factorial" la implementacin iterativa es probablemente ms rpida que en la
prctica que la recursiva. Esto es casi definido por la implementacin del algoritmo euclideano.
Este resultado es lgico, pues las funciones iterativas no tienen que pagar el exceso de llamadas
de funciones como en el caso de las funciones recursivas, y ese exceso es relativamente alto en
muchos lenguajes de programacin (ntese que mediante el uso de una lookup table es una
implementacin an ms rpida de la funcin factorial).
Hay otros tipos de problemas cuyas soluciones son inherentemente recursivas, porque estar al
tanto del estado anterior. Un ejemplo es el rbol transversal; otros incluyen la funcin de
Ackermann y el algoritmo divide y vencers tales como Quicksort. Todos estos algoritmos pueden
implementarse iterativamente con la ayuda de una pila, pero la necesidad del mismo, puede que
anule las ventajas de la solucin iterativa.
Otra posible razn para la utilizacin de un algoritmo iterativo en lugar de uno recursivo es el
hecho de que en los lenguajes de programacin modernos, el espacio de stack disponible para
un hilo es, a menudo, mucho menos que el espacio disponible en el montculo, y los algoritmos
recursivos suelen requerir ms espacio de stack que los algoritmos iterativos.

FUNCIONES DE RECURSIVIDAD DE COLA


Funciones de recursividad de cola son funciones que finalizan con una llamada recursiva que no
crea ninguna operacin deferida. Por ejemplo, la funcin gcd es recursiva de cola; sin embargo,
la funcin factorial (que tambin se muestra ms abajo) no es recursiva de cola porque crea
operaciones diferidas que tienen que realizarse incluso despus de que se complete la ltima
llamada recursiva. Con un compilador que automticamente optimiza llamadas recursivas de
cola, una funcin recursiva de cola, como por ejemplo gcd, se ejecutar usando un espacio
constante. As, el proceso que genera es esencialmente iterativo y equivalente a usar estructuras
de control de lenguaje imperativo como los bucles for y while .

Recursividad de cola: Recursividad en aumento:

//Entrada: Los enteros x e y, de forma //Entrada: n es un entero de


que x >= y e y > 0 forma que n >= 1
int gcd(int x, int y) int fact(int n)
{ {
if (y == 0) if (n == 1)
return x; return 1;
else else
return gcd(y, x % y); return n * fact(n - 1);
} }

La importancia de recursin de cola es que cuando se realiza una llamada recursiva de cola, la
posicin de retorno de la funcin que llama necesita grabarse en el call stack; cuando la funcin
recursiva retorna, continuar directamente a partir de la posicin de retorno grabada previamente.
Por ello, en compiladores que dan soporte a optimizacin de recursin de cola, este tipo de
recursin ahorra espacio y tiempo.
ORDEN EN EL LLAMAMIENTO DE UNA FUNCIN
El orden de llamamiento de una funcin puede alterar la ejecucin de una funcin, vase este
ejemplo en C:
Funcin 1
void recursiveFunction(int num) {
if (num < 5) {
printf("%d\n", num);
recursiveFunction(num + 1);
}
}

Funcin 2 con lneas cambiadas


void recursiveFunction(int num) {
if (num < 5) {
recursiveFunction(num + 1);
printf("%d\n", num);
}
}

RECURSIVIDAD DIRECTA E INDIRECTA


Se habla de recursividad directa cuando la funcin se llama a s misma. Se habla de recursividad
indirecta cuando, por ejemplo, una funcin A llama a una funcin B, que a su vez llama a una
funcin C, la cual llama a la funcin. De esta forma es posible crear largas cadenas y
ramificaciones.

CUESTIONARIO
1. Qu es la recursividad?
2. Dar una definicin de lo que son los fractales. Investigar al respecto.
3. Cul es la diferencia entre las funciones de recursividad de cola y las que no lo son?
4. A qu se refiere la recursividad directa y la recursividad indirecta?
5. Basndose en la funcin de la suma recursiva, programe la funcin recursiva para la resta.
6. Programe la funcin recursiva para la divisin.
7. Programe la funcin recursiva para el algoritmo de Euclides.
8. Programe la funcin recursiva para la potencia entera (34 = 81).

También podría gustarte